Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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
Java Hibernate中@MapsId注释的用途_Java_Hibernate - Fatal编程技术网

Java Hibernate中@MapsId注释的用途

Java Hibernate中@MapsId注释的用途,java,hibernate,Java,Hibernate,我试图理解@MapsId注释在Hibernate中的区别。我已经阅读了Hibernate文档,但是我仍然对其中给出的解释感到困惑,因为我对Hibernate还不熟悉 报告说: @Entity class Customer { @EmbeddedId CustomerId id; boolean preferredCustomer; @MapsId("userId") @JoinColumns({ @JoinColumn(name="userfirstname

我试图理解@MapsId注释在Hibernate中的区别。我已经阅读了Hibernate文档,但是我仍然对其中给出的解释感到困惑,因为我对Hibernate还不熟悉

报告说:

@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属性 共享相同的基础列(本例中为用户_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注释的概念。

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

谢谢Kanagaraj,您能告诉我哪一个被认为是主实体,哪一个是子实体吗?在您的情况下,客户是主实体,用户是子实体。