我已经定义了一个域名,其中“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
在你的Response
类中,你将id
字段定义为类型UUID
,但MySQL没有本机UUID
类型,因此它将列声明为char(36)
。您可能需要做的是更改它以使该字段为String
,然后提供执行转换String <-> UUID
的getter和setter方法。
作为更新的图书馆的更新,使用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并保持对象类型安全。
希望这可以帮助!