在一个实体中 hibernate 多个自然 id

标签 hibernate jpa jpa-2.0 hibernate-mapping jpa-2.1

我有一个 jpa 实体“用户”,它有 2 个业务 key 用户名和电子邮件。这 2 个字段是唯一的,我试图用 @NaturalId 将这两个字段定义为 naturalId,但是当我仅通过用户名或电子邮件搜索用户实体时,hibernate 会抛出一个异常,提示另一个 naturalid 的缺失值,因为 hibernate 处理了这两个字段字段作为复合自然 ID。这是 hibernate 的限制还是有解决此错误的替代方法?

@Entity
@Table(name = "user",
       indexes = { @Index(columnList = "login"),
                   @Index(columnList = "email")},
       uniqueConstraints = { @UniqueConstraint(columnNames = { "login" }),
                             @UniqueConstraint(columnNames = { "email" })})
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@org.hibernate.annotations.NaturalIdCache
public class User {

    @org.hibernate.annotations.NaturalId(mutable = true)
    private String login;

    @org.hibernate.annotations.NaturalId(mutable = true)
    private String email;

    ...
}

当我调用下面的代码时:
User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("login", "abc123")
    .load();

或者
User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("email", "abc123@xyz.com")
    .load();

我在提示缺少另一个自然 ID 时遇到错误。我必须设置两个自然 ID,这不是我想要的
User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("login", "abc123")
    .using("email", "abc123@xyz.com")
    .load();

最佳答案

这一概念不支持多个业务键。
正如你所说,用 @NaturalId 注释多个属性意味着这个唯一的业务 key 由多个属性组成(javadoc 引用):

This specifies that a property is part of the natural id of the entity.


API 的其余部分也有些相同。
例如 SimpleNaturalIdLoadAccess是通过 bySimpleNaturalId(Class entityClass) 创建的和 loadSimpleNaturalIdLoadAccess将自然 id 的值作为参数。没有办法指定哪个自然 id。

关于在一个实体中 hibernate 多个自然 id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112738/

相关文章:

java - Hibernate类设计,持久化List和HashMap

java - CrudRepository - 由于参数类型/数量问题,存储过程调用不起作用

java - JPA/Hibernate 是否支持迁移?

java - 包含 Map<Entity, Entity> 字段的正确方法是什么

java - CriteriaBuilder JPA 2.0 Eclipse链接

java - @ElementCollection、@CollectionTable 和 Enum - 奇怪的删除/插入行为

java - 具有额外连接条件的 JPA @JoinTable

java - hibernate/JPA : How to find sub entities using InheritanceType. 已加入

java - 由 : org. hibernate.exception.JDBCConnectionException 引起:调用 Driver#connect 时出错

jpa - 是否可以通过并测试 JPA 中的空列表?