Pau*_*ley 6 java persistence jpa
我有一个Java对象,其字段是UUID.我希望能够以显而易见的方式将此对象持久化到数据库中; 但是,Basic映射将使用Java序列化来编写它,而我希望UUID以其明显的字符串形式出现.有没有办法为JPA为该字段提供UUID < - >字符串转换器,这将在读写时使用,所以我可以自然地处理这种类型?
除了为同一字段的不同表示创建单独的getter/setter之外,JPA 2.0不提供执行此操作的一般方法.
根据您的JPA提供程序,您可以使用特定于实现的方法,例如,Hibernate uuid-char为此提供了一种类型:
@Type(type = "uuid-char")
private UUID uuid;
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
3066 次 |
| 最近记录: |