Hibernate 一个实体内的多个自然id
Hibernate multiple natural id within an entity
我有一个 jpa 实体 "user",它有 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 注释多个属性意味着这个唯一的业务密钥由多个属性组成(javadoc 引用):
This specifies that a property is part of the natural id of the
entity.
API 的其余部分也有相同的传达方式。
例如 SimpleNaturalIdLoadAccess
是通过 bySimpleNaturalId(Class entityClass) and load 在 SimpleNaturalIdLoadAccess
中创建的,将自然 id 的值作为参数。无法指定哪个自然id。
我有一个 jpa 实体 "user",它有 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 注释多个属性意味着这个唯一的业务密钥由多个属性组成(javadoc 引用):
This specifies that a property is part of the natural id of the entity.
API 的其余部分也有相同的传达方式。
例如 SimpleNaturalIdLoadAccess
是通过 bySimpleNaturalId(Class entityClass) and load 在 SimpleNaturalIdLoadAccess
中创建的,将自然 id 的值作为参数。无法指定哪个自然id。