2011-07-06 13 views
5

ben db bu şema var:hazırda JPA ek açıklama: Gömülü Id ilgili sorun

Table_A [1] -> [n] Table_C ve Table_B [1] -> [n] Table_C

Şimdi, Table_C'nin PrimaryKey'i, Foreign_d ve Foreign Key ve Table_B'ye karşı Foreign anahtarlı bir EmbeddedId'dir. Bu notu nasıl kaydederim?

Benim çözümdür: JPA spec izlediğinizde, TableC haritasına gerek yoktur olduğuna dikkat edecektir

@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

İlişki çift yönlü – giulius

cevap

5

. Eğer JoinTable bir şey eşleştirmek istiyorsanız sadece aynı zamanda bir Varlık olarak tanımlayabiliriz bu

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

gibi jointable

şey kullanabilirsiniz. Sen/insertable güncellenebilir nesneler yanlış yaparak bu

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

gibi TableC haritalayabilirsiniz Eğer aynı özelliklere birden çok kez eşleyebilirsiniz. Kimliğindeki diğer özellikler, ödeme yapmanıza izin vermez, çünkü pk'nizi bozarsınız.

+0

olmalıdır. Tablo C'nin eşlenmesi gereken başka özelliklere sahipse? Onları nasıl eşleyebilirim? – giulius

+0

Önceki evladım, soruna doğrudan bir cevap vermedi, genişlettim. – jelle

+0

Soruma göre tek bir çözümünüz var mı? – giulius