hibernate - tabla - Hibernar clave foránea como parte de la clave principal
insertar en tabla con clave foranea (3)
Tengo que trabajar con hibernate y no estoy muy seguro de cómo resolver este problema, tengo 2 table con una relación 1..n como esta:
------- TABLE_A ------- first_id (pk) second_id (pk) [other fields] ------- TABLE_B ------- first_id (pk)(fk TABLE_A.first_id) second_id (pk)(fk TABLE_A.second_id) third_id (pk) [other fields]
¿Cómo puedo gestionar esto con Hibernate?
No tengo idea de cómo administrar la clave primaria para la segunda tabla ...
Hay un ejemplo que es completamente similar a su caso en la documentación de referencia de Hibernate . Justo antes de este ejemplo, encontrarás las explicaciones. Aquí está el ejemplo, que coincide con su problema (el usuario es la tabla A, y el cliente es la tabla B):
@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
}
Nota: sería mucho más sencillo que tuvieras un identificador sustituto para esas dos tablas. A menos que esté obligado a tratar con un esquema heredado, hágase un favor y use claves sustitutivas.
Use las anotaciones @PrimaryKeyJoinColumn
y @PrimaryKeyJoinColumns
. Del manual de Hibernate :
La anotación
@PrimaryKeyJoinColumn
dice que la clave primaria de la entidad se usa como el valor de la clave externa para la entidad asociada.
public class User implements Serializable {
/**
*
*/
private static final long serialVersionUID = 5478661842746845130L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
}
@Entity
public class Author {
@Id
@Column(name = "AUTHOR_ID", nullable = false)
private int authorId;
@Column(name = "ENABLED", nullable = false, length = 1)
private boolean enabled;
@OneToOne
@MapsId
@JoinColumn(name = "AUTHOR_ID", referencedColumnName = "ID", nullable = false, insertable = false, updatable = false)
User user;
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}