Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在实体中休眠多个自然id_Hibernate_Jpa_Jpa 2.0_Hibernate Mapping_Jpa 2.1 - Fatal编程技术网

Hibernate 在实体中休眠多个自然id

Hibernate 在实体中休眠多个自然id,hibernate,jpa,jpa-2.0,hibernate-mapping,jpa-2.1,Hibernate,Jpa,Jpa 2.0,Hibernate Mapping,Jpa 2.1,我有一个jpa实体“用户”,它有两个业务密钥用户名和电子邮件。这两个字段是唯一的,我试图用@naturaid将这两个字段定义为naturaid,但是当我只通过传递用户名或电子邮件搜索用户实体时,hibernate引发异常,抱怨另一个自然id的值丢失,因为hibernate将这两个字段都视为复合自然id。这是hibernate的限制还是有其他方法可以解决此错误 @Entity @Table(name = "user", indexes = { @Index(columnList =

我有一个jpa实体“用户”,它有两个业务密钥用户名和电子邮件。这两个字段是唯一的,我试图用@naturaid将这两个字段定义为naturaid,但是当我只通过传递用户名或电子邮件搜索用户实体时,hibernate引发异常,抱怨另一个自然id的值丢失,因为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();

我遇到错误,抱怨缺少另一个自然id。我必须设置两个自然id,这不是我想要的

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

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

正如您所说,使用注释多个属性意味着这个唯一的业务密钥由多个属性组成(javadoc引文):

这指定属性是对象的自然id的一部分 实体

另外,API的其余部分在某种程度上也传达了相同的信息。
例如,
SimpleNaturalIdLoadAccess
是通过创建的,并且在
SimpleNaturalIdLoadAccess
中将自然id的值作为参数。无法指定witch natural id。

请共享您实体的代码以及所选内容。各位,我已经共享了代码
User entity = em.unwrap(Session.class)          
    .byNaturalId(User.class)
    .using("login", "abc123")
    .using("email", "abc123@xyz.com")
    .load();