Hibernate/JPA 中的类型安全主键

Posted

技术标签:

【中文标题】Hibernate/JPA 中的类型安全主键【英文标题】:Typesafe Primary Key in Hibernate/JPA 【发布时间】:2010-02-05 19:09:43 【问题描述】:

我正在寻找一种在 Hibernate 中使用泛型为我的实体提供类型安全主键的方法。而不是这样做

@Entity
public class User

@PrimaryKey
Long id


我正在考虑这样做......

@Entity
public class User

@PrimaryKey
PrimaryKey<User,Long> id


或者更进一步地进行类型推断......

有什么想法吗?以前有人试过吗?你会通过使你的类 PrimaryKey 可嵌入来做到这一点吗?

@Entity
public class User extends MyEntity<Long>//Primary key type

@PrimaryKey
PrimaryKey<User> id;


【问题讨论】:

可以使用类型转换器代替嵌入式类型。但还没有测试方法 7 年过去了,@Benju 能否请您分享一下经验,您最终是否使用过它,它有帮助吗? 【参考方案1】:

虽然可以使用 PK 类并将其用作具有 @EmbeddedId 的实体的成员,但这通常会使您的所有 JQL 查询和 Java 代码更加冗长:

select a.addressKey.id from Address a

AddressKey addressKey = new AddressKey();
addressKey.setCountry("USA");
addressKey.setId(634);
Address a = entityManager.find(Address.class, addressKey);    

所以我个人只会将它用于真正的复合键(即不具有单个属性)。

实际上,我真的很想知道您要解决什么问题,因为最后,无论如何您都必须处理Long。我并没有真正看到单个属性类型安全主键的附加值。

【讨论】:

【参考方案2】:

如果您正在寻找一种类型安全的方式来识别实体,那么使用它的 LazyLoadingProxy 怎么样?

【讨论】:

以上是关于Hibernate/JPA 中的类型安全主键的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate JPA与共享主键外键字段的一对一双向映射为空(hb无法自动设置)

hibernate jpa将两个表与另一个表连接起来

Hibernate JPA 序列(非 Id)

hibernate JPA:可选值生成

hibernate.jpa.criteria.BasicPathUsageException:无法加入基本类型的属性

Spring Security JDBC 和 Hibernate JPA