Понимание аннотации @MapsId в HibernateJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Понимание аннотации @MapsId в Hibernate

Сообщение Anonymous »

В соответствии с документацией Hibernate объяснение аннотации @MapsId дается как:


Во встроенном объекте id ассоциация представлена ​​как
идентификатор связанного объекта. Но вы можете связать его значение с
обычной ассоциацией в сущности с помощью аннотации @MapsId. Значение
@MapsId соответствует имени свойства встроенного объекта id
, содержащего идентификатор связанного объекта. В базе данных
это означает, что свойства Customer.user и CustomerId.userId
используют один и тот же базовый столбец (в данном случае user_fk).

Код: Выделить всё

@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
}
Также здесь говорится:


Хотя Hibernate не поддерживается в JPA, Hibernate позволяет разместить вашу ассоциацию
непосредственно во встроенном компоненте id (вместо использования
аннотации @MapsId).

Код: Выделить всё

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

@Embeddable
class CustomerId implements Serializable {
@OneToOne
@JoinColumns({
@JoinColumn(name="userfirstname_fk", referencedColumnName="firstName"),
@JoinColumn(name="userlastname_fk", referencedColumnName="lastName")
})
User user;
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
}
Я пытался сгенерировать таблицы с помощью самого Hibernate (

Код: Выделить всё

hbm2ddl.auto=create
), чтобы понять, как используется аннотация @MapsId. Вот мои наблюдения:

Если мое объявление сущности для Клиента и Пользователя выглядит следующим образом:

Код: Выделить всё

@Entity
@Table(name="TBL_CUSTOMER")
public 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;
}

@Entity
@Table(name="TBL_USER")
class User {
@EmbeddedId UserId id;
Integer age;
}
Затем операторы DDL, сгенерированные Hibernate, говорят:

Код: Выделить всё

Hibernate: create table TBL_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 TBL_USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table TBL_CUSTOMER add constraint UK_chvh5mukc81xk9t6fis3skab  unique (userfirstname_fk, userlastname_fk)
Hibernate: alter table TBL_CUSTOMER add constraint FK_chvh5mukc81xk9t6fis3skab foreign key (userfirstname_fk, userlastname_fk) references TBL_USER
Теперь, если я изменю сущность «Клиент» на:

Код: Выделить всё

@Entity
@Table(name="TBL_CUSTOMER")
public class Customer {
@EmbeddedId CustomerId id;
boolean preferredCustomer;

@OneToOne User user;
}
Тогда операторы DDL:

Код: Выделить всё

Hibernate: create table TBL_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 TBL_USER (firstName varchar2(255 char) not null, lastName varchar2(255 char) not null, age number(10,0), primary key (firstName, lastName))
Hibernate: alter table TBL_CUSTOMER add constraint FK_et3bgekef237d4kov7b9oqt85 foreign key (user_firstName, user_lastName) references TBL_USER
В этом случае я вижу два дополнительных столбца (имя и фамилия) для TBL_CUSTOMER, если я удалю аннотации @MapsId и @JoinColumn. Кроме того, в этом случае нет дополнительной команды изменения.

Я новичок в Hibernate, поэтому мне трудно понять объяснение, данное в документации Hibernate, какова цель @MapsId, когда мы должны его использовать и как он влияет на базовую схему базы данных.

Кроме того, я просмотрел этот пост SO - может кто-нибудь объяснить мне @MapsId в спящем режиме? но я не могу получить четкую информацию по этой аннотации.

Подробнее здесь: https://stackoverflow.com/questions/252 ... -hibernate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»