web-dev-qa-db-fra.com

quelqu'un peut-il m'expliquer @MapsId en veille prolongée?

Quelqu'un peut-il m'expliquer @MapsId en veille prolongée? J'ai du mal à le comprendre.

Ce serait formidable si on pouvait l'expliquer avec un exemple et dans quel type de cas d'utilisation est-il le plus applicable?

57
brainydexter

Voici une belle explication de Object DB .

Désigne un attribut de relation ManyToOne ou OneToOne qui fournit le mappage pour une clé primaire EmbeddedId, un attribut dans une clé primaire EmbeddedId ou une simple clé primaire de l'entité parent. L'élément value spécifie l'attribut d'une clé composite auquel l'attribut de relation correspond. Si la clé primaire de l'entité est du même type Java que la clé primaire de l'entité référencée par la relation, l'attribut value n'est pas spécifié.

// 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;
}

Lisez les API Docs ici.

35
ManuPK

J'ai trouvé cette note également utile: @MapsId dans l'annotation de mise en veille prolongée mappe une colonne avec la colonne d'une autre table.

Il peut également être utilisé pour partager la même clé primaire entre 2 tables.

Exemple:

@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;
    ...
}
13
Tonsic