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

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

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

Ответы [ 2 ]

34 голосов
/ 29 марта 2012

Вот хорошее объяснение от объекта БД .

Определяет атрибут отношения 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 Docs здесь.

13 голосов
/ 31 января 2018

Я также нашел это примечание полезным: @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;
    ...
}
...