2012-05-30 30 views
1

我有3班一個非常簡單的項目:休眠@Embeddable行爲二次表

@Entity 
@Table(name = "A", uniqueConstraints = {}) 
@org.hibernate.annotations.Table(appliesTo = "A", indexes = {}) 
@SecondaryTable(name = "C", pkJoinColumns {@PrimaryKeyJoinColumn(columnDefinition = "A_ID", name = "A_ID")}) 
public class Machine 
{ 
    @Id 
    @GeneratedValue 
    @Column(name = "A_ID", nullable = false) 
    private Integer id; 

    @Column(name = "a1", nullable = false) 
    private Integer a1; 

    @Column(name = "c1", table = "C", nullable = false) 
    private Integer c1; 

    @ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "A_B", joinColumns = {@JoinColumn(name = "A_ID")}, inverseJoinColumns = {@JoinColumn(name = "B_ID")}) 
    private List<B> bs = new ArrayList<B>(); 

} 

@Entity 
@Table(name = "B") 
@SecondaryTable(name = "A_B", pkJoinColumns = {@PrimaryKeyJoinColumn(columnDefinition = "B_ID", name = "B_ID")}) 
@org.hibernate.annotations.Table(appliesTo = "B") 
public class B { 

    @Id 
    @GeneratedValue 
    @Column(name = "B_ID", nullable = false) 
    private Integer id; 

    @Column(name = "B_1", nullable = false) 
    private Integer b1; 

    @Embedded 
    @AttributeOverrides({ 
@AttributeOverride(name = "d1", column = @Column(name = "D_1", table = "A_B")), 
@AttributeOverride(name = "d2", column = @Column(name = "D_2", table = "datastore_assignment"))}) 
    private final D d = new D(); 

    } 

@Embeddable 
public class D 
{ 
    private long d1; 

    private long d2; 
} 

當插入會議一拖二BI一個實例所期望的:

A_B table 
A_ID B_ID D_1 D_2 
    1  1  1  1 
    1  2  1  1 

但這事情是:

A_B table 
A_ID B_ID D_1 D_2 
    1  1  0  0 
    1  2  0  0 
    1 NULL  1  1 
    1 NULL  1  1 

任何想法?

謝謝!

問候。

ssedano。

回答

2

問題是A不知道D_1和D_2並且不插入它們。休眠並不在意鏈接表和輔助表是否相同,並在保存B時將其插入到D_1/D_2中。要解決此問題,請執行以下操作:要解決此問題,請執行以下操作:要解決此問題,請執行以下操作:

添加反向信息A不應插入A_B,因爲它不會知道D_1和D_2

@ManyToMany(fetch = FetchType.LAZY, mappedBy = ...) 
@JoinTable(name = "A_B", joinColumns = {@JoinColumn(name = "A_ID")}, inverseJoinColumns = {@JoinColumn(name = "B_ID")}) 
private List<B> bs = new ArrayList<B>(); 

和映射B中

@ManyToOne(name = "B_1", nullable = false, table = "A_B") 
private A a; 

的參照確保您設置

a.getBs().Add(b); 
b.setA(a); 
+0

@Inverse是什麼包?謝謝 – ssedano

+0

恩,對不起,在JPA它映射我認爲 – Firo