【问题标题】:Purpose of @MapsId annotation in HibernateHibernate 中 @MapsId 注释的用途
【发布时间】:2014-08-12 16:47:20
【问题描述】:

我试图了解 @MapsId 注释在 Hibernate 中的不同之处。我已经阅读了 Hibernate 文档,但我仍然对那里给出的解释感到困惑,因为我是 Hibernate 的新手。

document 是这样说的:

@Entity
class Customer {
   @EmbeddedId CustomerId id;
   boolean preferredCustomer;

   @MapsId("userId")
   @JoinColumns({
      @JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
      @JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
   })
   @OneToOne User user;
}

@Embeddable
class CustomerId implements Serializable {
   UserId userId;
   String customerNumber;

   //implements equals and hashCode
}

@Entity 
class User {
   @EmbeddedId UserId id;
   Integer age;
}

@Embeddable
class UserId implements Serializable {
   String firstName;
   String lastName;

   //implements equals and hashCode
}

在嵌入的 id 对象中,关联表示为 关联实体的标识符。但是您可以将其值链接到 通过 @MapsId 注释在实体中进行常规关联。这 @MapsId 值对应嵌入​​id的属性名 包含关联实体标识符的对象。在数据库中, 这意味着 Customer.user 和 CustomerId.userId 属性 共享相同的基础列(在本例中为 user_fk)。

我不清楚这个解释是什么意思,所以我厌倦了在我的配置文件中将hbm2ddl 设置为create,我观察到了这些:

在客户实体上使用@MapsId 和@JoinColumns,DDL 语句是:

Hibernate: create table CUSTOMER (customerNumber varchar2(255 char) not null, preferredCustomer number(1,0) not null, userfirstname_fk varchar2(255 char) not null, userlastname_fk varchar2(255 char) not null, primary key (customerNumber, userfirstname_fk, userlastname_fk))
Hibernate: create table USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table CUSTOMER add constraint UK_xxxx  unique (userfirstname_fk, userlastname_fk)
Hibernate: alter table CUSTOMER add constraint FK_xxxx foreign key (userfirstname_fk, userlastname_fk) references TBL_USER

如果我删除 @MapsId 和 @JoinColumns 注释,我会看到这些:

Hibernate: create table CUSTOMER (customerNumber varchar2(255 char) not null, firstName varchar2(255 char), lastName varchar2(255 char), preferredCustomer number(1,0) not null, user_firstName varchar2(255 char), user_lastName varchar2(255 char), primary key (customerNumber, firstName, lastName))
Hibernate: create table USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table CUSTOMER add constraint FK_xxxx foreign key (user_firstName, user_lastName) references TBL_USER

请帮助我理解Hibernate中@MapsId注解的概念。

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    @MapsId 将主实体的主键共享为子实体的主键,无需在子实体中插入外键。 Hibernate 将映射两个实体的 PK 并返回给我们一个对象。

    【讨论】:

    • 谢谢Kanagaraj,你能告诉我哪个是主要实体,哪个是子实体吗?
    • 在您的情况下,客户是主要实体,用户是子实体。
    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 2016-06-08
    • 1970-01-01
    • 2011-12-07
    • 2011-06-03
    • 2023-01-31
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多