Подтвердить что ты не робот

Может кто-нибудь, пожалуйста, объясните мне @MapsId в спящем режиме?

Может кто-нибудь объяснить мне @MapsId в спящем режиме? Мне трудно это понять.

Было бы здорово, если бы можно было объяснить это на примере, и в каких случаях он наиболее применим?

4b9b3361

Ответ 1

Вот хорошее объяснение из Object DB.

Обозначает атрибут отношения ManyToOne или OneToOne, который обеспечивает сопоставление первичного ключа EmbeddedId, атрибута внутри первичного ключа EmbeddedId или простого первичного ключа родительского объекта. Элемент value указывает атрибут в составном ключе, которому соответствует атрибут отношения. Если первичный ключ объекта имеет тот же тип Java, что и первичный ключ объекта, на который ссылается связь, атрибут value не указан.

// parent entity has simple primary key

@Entity
public class Employee {
   @Id long empId;
   String name;
   ...
} 

// dependent entity uses EmbeddedId for composite key

@Embeddable
public class DependentId {
   String name;
   long empid;   // corresponds to primary key type of Employee
}

@Entity
public class Dependent {
   @EmbeddedId DependentId id;
    ...
   @MapsId("empid")  //  maps the empid attribute of embedded id
   @ManyToOne Employee emp;
}

Ознакомьтесь с Документами API здесь.

Ответ 2

Я также нашел это примечание полезным: @MapsId в аннотации гибернации отображает столбец с другим столбцом таблицы.

Его также можно использовать для совместного использования одного и того же первичного ключа между двумя таблицами.

Пример:

@Entity
@Table(name = "TRANSACTION_CANCEL")
public class CancelledTransaction {
    @Id
    private Long id; // the value in this pk will be the same as the
                     // transaction line from transaction table to which 
                     // this cancelled transaction is related

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ID_TRANSACTION", nullable = false)
    @MapsId
    private Transaction transaction;
    ....
}

@Entity
@Table(name = "TRANSACTION")
@SequenceGenerator(name = "SQ_TRAN_ID", sequenceName = "SQ_TRAN_ID")
public class Transaction  {
    @Id
    @GeneratedValue(generator = "SQ_TRAN_ID", strategy = GenerationType.SEQUENCE)
    @Column(name = "ID_TRANSACTION", nullable = false)
    private Long id;
    ...
}