将UUID作为字段映射到mysql数据库时的列类型错误

问题描述 投票:2回答:2

我已经定义了一个域名,其中“java.util.UUID”作为其“Id”字段。

@Entity
class Response{ 
 @Id
 @GeneratedValue(generator = "myUUIDGenerator")
 @GenericGenerator(name = "myUUIDGenerator", strategy = "uuid2")
 @Column(columnDefinition = "uuid")
 private UUID id;
 ...
}

我正在使用liquibase来生成数据库。

<createTable tableName="response">
    <column name="id" type="uuid">
        <constraints primaryKey="true" nullable="false"/>
    </column>
</createTable>

MySQL生成的表将生成的id列描述为“char(36)”。

运行测试用例时会出现此问题。它说以下并没有执行任何测试用例。

Wrong column type in DBNAME_response for column id. Found: char, expected: uuid
spring-data-jpa liquibase liquibase-hibernate
2个回答
1
投票

在你的Response类中,你将id字段定义为类型UUID,但MySQL没有本机UUID类型,因此它将列声明为char(36)。您可能需要做的是更改它以使该字段为String,然后提供执行转换String <-> UUID的getter和setter方法。


0
投票

作为更新的图书馆的更新,使用JPA2.1,你不应该去SteveDonie的路线 -

声明属性转换器:

@Converter()
public class UUIDAttributeConverter implements AttributeConverter<UUID, String>, Serializable {

    @Override
    public String convertToDatabaseColumn(UUID locDate) {
        return (locDate == null ? null : locDate.toString());
    }

    @Override
    public UUID convertToEntityAttribute(String sqlDate) {
        return (sqlDate == null ? null : UUID.fromString(sqlDate));
    }

}

将持久性单元标记为persistence.xml中应用的转换器(如果不是autoApply)

<class>UUIDAttributeConverter</class>

适用于领域

@Id
@Column(unique = true, nullable = false, length = 64)
@Convert(converter = UUIDAttributeConverter.class)
private UUID guid;

这允许您指定转换应该仅在某些持久性单元(例如MySql)中发生,而不是在其他遵守的单元中发生。它还正确地将项目映射到db并保持对象类型安全。

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.