可以说服JPA在例如UUID和字符串之间进行转换吗?

Pau*_*ley 6 java persistence jpa

我有一个Java对象,其字段是UUID.我希望能够以显而易见的方式将此对象持久化到数据库中; 但是,Basic映射将使用Java序列化来编写它,而我希望UUID以其明显的字符串形式出现.有没有办法为JPA为该字段提供UUID < - >字符串转换器,这将在读写时使用,所以我可以自然地处理这种类型?

axt*_*avt 5

除了为同一字段的不同表示创建单独的getter/setter之外,JPA 2.0不提供执行此操作的一般方法.

根据您的JPA提供程序,您可以使用特定于实现的方法,例如,Hibernate uuid-char为此提供了一种类型:

@Type(type = "uuid-char")
private UUID uuid;
Run Code Online (Sandbox Code Playgroud)

  • @Paul:实际上这是一个非常普遍的需求,也许是[JPA 2.1](http://jcp.org/en/jsr/detail?id=338)最令人期待的功能之一. (2认同)

use*_*322 5

Chris Lercher 评论注:从 JPA 2.1 开始,@Convert annotation can be used with an AttributeConverter<UUID, String> .

这种方法运行良好并且与任何 JPA 提供程序兼容,而这@Type(type = "uuid-char")是特定于提供程序的。此外,withautoApply=true应用于每个实体的每个字段,因此无需注释每个实体中的每个字段。请参阅此处的文档并检查以下示例:

转换器类

@Converter(autoApply = true)
public class UuidConverter implements AttributeConverter<UUID, String> {

    @Override
    public String convertToDatabaseColumn(final UUID entityValue) {
        return ofNullable(entityValue)
                .map(entityUuid -> entityUuid.toString())
                .orElse(null);
    }

    @Override
    public UUID convertToEntityAttribute(final String databaseValue) {
        return ofNullable(databaseValue)
                .map(databaseUuid -> UUID.fromString(databaseUuid))
                .orElse(null);
    }
}
Run Code Online (Sandbox Code Playgroud)


实体

@Entity
public class Customer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    @Column
    private String name;

    @Column(nullable = false, unique = true, updatable = false, columnDefinition="CHAR(36)")
    private UUID customerId = randomUUID();

    //.....
}
Run Code Online (Sandbox Code Playgroud)


这就是它在数据库中的样子

TABLE customer
ID  BIGINT(19)  NO  PRI (NEXT VALUE FOR SYSTEM_SEQUENCE_5D3)
NAME    VARCHAR(255)    YES     NULL
CUSTOMER_ID VARCHAR(36) NO  UNI NULL
Run Code Online (Sandbox Code Playgroud)