2011-07-06 11 views
5

mam ten schemat db:hibernacji jpa Adnotacja Problem z osadzonym Id

table_a [1] -> [n] Table_C i table_b [1] -> [n] Table_C

Teraz PrimaryKey z Table_C to EmbeddedId z kluczem obcym kontra Table_A i kluczem obcym kontra Table_B. Jak mogę zanotować tę adnotację?

Moje rozwiązanie to:

@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

Relacja musi być dwukierunkowa. – giulius

Odpowiedz

5

Po wykonaniu spec WZP, można zauważyć, że nie ma potrzeby map tableC. można po prostu użyć jointable

coś takiego

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

jeśli chcesz mapować coś w JoinTable można również zdefiniować go jako całość. Tabelę C można odwzorować tak, jak to

@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,... 
} 

Dzięki temu, że obiekty można wstawiać/aktualizować jako fałszywe, można odwzorowywać te same właściwości wiele razy. Pozostałe właściwości w id nie są możliwe do uaktualnienia, ponieważ złamiesz pk.

+0

Jeśli w tabeli C występują inne atrybuty, które powinny zostać odwzorowane? Jak mogę je zmapować? – giulius

+0

Mój poprzedni awnser nie był bezpośredni awnser do twojego pytania, rozszerzyłem to. – jelle

+0

Na moje pytanie masz jedno rozwiązanie? – giulius

Powiązane problemy