2011-07-06 44 views
5

tengo este esquema de db:Hibernate Jpa Anotación: Problema con Id Embedded

TABLE_A [1] -> [n] Table_C y Table_B [1] -> [n] Table_C

Ahora, la clave primaria de la tabla_C es un Id. Incrustado con clave externa en comparación con la tabla_A y clave externa en comparación con la tabla_B. ¿Cómo tomo nota de esta anotación?

Mi solución es:

@Entity 
public class TableA{ 
    @Id @column(name="ID") 
    public int id; 

    @OneToMany(mappedBy="tableA") 
    public List<TableC> listOftableC; 
} 

@Entity 
public class TableB{ 
    @Id @column(name="ID") 
    public String id; 

    @OneToMany(mappedBy="tableB") 
    public List<TableC> listOftableC; 

} 

@Entity 
public class TableC{ 
    @EmbeddedId 
    public TableCPK idComposite; 
} 

@Embeddable 
public class TableCPK{ 

    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID") 
    public TableA tableA; 

    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID") 
    public TableA tableB; 
} 
+0

La relación debe ser bidireccional – giulius

Respuesta

5

Al seguir la especificación JPA, se dará cuenta de que no hay necesidad de asignar TableC. Usted sólo puede usar una joinTable

Algo como esto

@Entity 
public class TableA{ 
    @Id 
    @column(name="ID") 
    public int id; 
    @ManyToMany 
    @JoinTable(name="TableC", 
      joinColumns = {@JoinColumn(name = "ID_TABLE_A", referencedColumnName="ID")}, 
      inverseJoinColumns = {@JoinColumn(name = "ID_TABLE_B", referencedColumnName="ID") 
    }) 
    public List<TableB> listOftableB; 
} 
@Entity 
public class TableB{ 
    @Id @column(name="ID") 
    public String id; 
    @OneToMany(mappedBy="listOftableB") 
    public List<TableA> listOftableA; 
} 

si desea asignar algo en el joinTable también se puede definir como una entidad. Puede asignar TableC como esto

@Entity 
public class TableC{ 
    @EmbeddedId 
    private MyId id; 
    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_A", insertable = false, updatable = false) 
    private TableB tableA; 
    @ManyToOne 
    @JoinColumn(name = "ID_TABLE_B", insertable = false, updatable = false) 
    private TableB tableB; 

    @Column(name="extra_field") 
    private String extraField; 
} 

@Embeddable 
public class MyId{ 
    @Column(name="ID_TABLE_A") 
    private int idTableA; 
    @Column(name="ID_TABLE_B") 
    private int idTableB; 
    // equals, hascode,... 
} 

Al hacer que los objetos insertables/actualizables falsa, puede asignar las mismas propiedades varias veces. Las otras propiedades en el ID no son actualizables, porque romperías tu pk.

+0

Si la tabla C tiene otros atributos que deberían asignarse? ¿Cómo puedo mapearlos? – giulius

+0

Mi respuesta anterior no fue una respuesta directa a su pregunta, la he expandido. – jelle

+0

Para mi pregunta, ¿tiene una solución? – giulius

Cuestiones relacionadas