【问题标题】:Hibernate multiple natural id within an entity在实体中休眠多个自然 ID
【发布时间】:2019-02-06 07:49:32
【问题描述】:

我有一个 jpa 实体“用户”,它有 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();

【问题讨论】:

  • 请分享您的实体代码以及选择。
  • 伙计们,我已经分享了代码

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


【解决方案1】:

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

正如你所说,用@NaturalId 注释多个属性意味着这个唯一的业务密钥包含多个属性(javadoc 引用):

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

API 的其余部分也有相同的通信方式。 例如SimpleNaturalIdLoadAccess 是通过bySimpleNaturalId(Class entityClass)loadSimpleNaturalIdLoadAccess 中创建的,将自然id 的值作为参数。无法指定哪个自然 id。

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    相关资源
    最近更新 更多