休眠实体中的多个自然ID

时间:2018-08-31 09:46:28

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

我有一个jpa实体“用户”,其中有2个业务密钥用户名和电子邮件。这2个字段是唯一的,我尝试用@NaturalId将这两个字段都定义为naturalId,但是当我仅通过传递用户名或电子邮件来搜索用户实体时,hibernate抛出异常,抱怨另一个naturalid的值缺失,因为hibernate对待这两个字段字段作为复合自然ID。这是休眠的限制,还是有解决此错误的替代方法?

@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();

1 个答案:

答案 0 :(得分:0)

此概念不支持多个业务密钥。

正如您所说,用@NaturalId注释多个属性意味着该唯一的业务密钥包含多个属性:

  

这指定属性是的自然ID的一部分   实体。

API的其余部分也进行了相同的通信。 例如,SimpleNaturalIdLoadAccess是通过bySimpleNaturalId(Class entityClass)创建的,而SimpleNaturalIdLoadAccess中的load将自然id的值作为参数。无法指定女巫的自然ID。