我有一个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();
答案 0 :(得分:0)
此概念不支持多个业务密钥。
正如您所说,用@NaturalId注释多个属性意味着该唯一的业务密钥包含多个属性:
这指定属性是的自然ID的一部分 实体。
API的其余部分也进行了相同的通信。
例如,SimpleNaturalIdLoadAccess
是通过bySimpleNaturalId(Class entityClass)创建的,而SimpleNaturalIdLoadAccess
中的load将自然id的值作为参数。无法指定女巫的自然ID。