¿Puede alguien explicarme @MapsId en hibernate? Me está costando entenderlo.¿alguien puede explicarme @MapsId en Hibernate?
Sería genial si se pudiera explicar con un ejemplo y en qué tipo de casos de uso es más aplicable?
¿Puede alguien explicarme @MapsId en hibernate? Me está costando entenderlo.¿alguien puede explicarme @MapsId en Hibernate?
Sería genial si se pudiera explicar con un ejemplo y en qué tipo de casos de uso es más aplicable?
Aquí hay una buena explicación de Object DB.
designa un atributo de relación ManyToOne o OneToOne que proporciona la asignación de una clave de EmbeddedId primaria, un atributo dentro de una clave primaria EmbeddedId, o una clave principal sencilla de la entidad matriz. El elemento de valor especifica el atributo dentro de una clave compuesta a la que corresponde el atributo de relación. Si la clave principal de la entidad es del mismo tipo Java que la clave primaria de la entidad a la que hace referencia la relación, el atributo de valor no se especifica.
// 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;
}
Leer el API Docs aquí.
Encontré esta nota también útil: @MapsId
en la anotación de hibernación mapea una columna con la columna de otra tabla.
Se puede utilizar también para compartir la misma clave primaria entre 2 tablas.
Ejemplo:
@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;
...
}