una tabla llaves llave insertar hacer foreign foraneas foranea datos con compuesta como clave hibernate foreign-keys composite-primary-key

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