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

时间:2017-03-28 13:48:24

标签: spring-data-jpa liquibase liquibase-hibernate

我已经定义了一个“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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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并保持对象类型安全。

希望这有帮助!