2011-08-22 11 views
9


tengo que trabajar con Hibernate y no muy seguro de cómo resolver este problema, he 2 mesa con una relación 1..n así:
clave externa Hibernate como parte de la clave primaria

 
------- 
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 gestionar la clave principal de la segunda tabla ...

Respuesta

14

Hay un ejemplo que es completamente similar a su caso en el Hibernate reference documentation. Justo antes de este ejemplo, encontrarás las explicaciones. Aquí está el ejemplo, que coincide con su problema (Usuario es el cuadro A, y el Cliente es el cuadro 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 simple de que tenías 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.

+0

¿Pero sabes si hay algunos problemas si cambio en lugar de poner la anotación de OneToOne en el cliente, poner OneToMany en la clase de usuario? – rascio

+0

Tendrás que convertirla en una asociación OneToMany/ManyToOne bidireccional. –

+0

Al hacerlo, obtengo 'Attribute" userId "tiene una asignación inválida en este contexto' dentro de' CustomerId' –

3

Uso @PrimaryKeyJoinColumn y @PrimaryKeyJoinColumns anotaciones. De Hibernate manual:

La anotación @PrimaryKeyJoinColumn sí dice que la clave principal de la entidad se utiliza como valor de clave externa a la entidad asociada.

+2

Esto no responde a la pregunta del OP: tiene una clave primaria compuesta, y algunos de los campos de esta clave primaria compuesta constituyen una clave foránea para otra entidad. @PrimaryKeyJoinColumn se usa cuando una clave principal también es una clave externa. –

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

} 
+0

Mi problema era un poco diferente, en mi caso la entidad 'User' tiene' username' y 'email' como PK (así puedo tener el mismo nombre de usuario asociado a diferentes correos electrónicos) y 'Autor' que tiene la misma PK que' User' ('username',' email') y también 'vatCode', no solo' id' como en tu ejemplo;) – rascio

Cuestiones relacionadas