开发者

Hibernate Jpa Annotation: Problem with Embedded Id

开发者 https://www.devze.com 2023-03-18 03:44 出处:网络
I have this schema of db: Table_A[1]-->[n]Table_C and Table_B[1]-->[n]Table_C Now, the PrimaryKey of Table_C is a EmbeddedId with Foreign key versus Table_A and Foreign Key versus Table_B. How do I

I have this schema of db:

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

Now, the PrimaryKey of Table_C is a EmbeddedId with Foreign key versus Table_A and Foreign Key versus Table_B. How do I no开发者_如何学编程te this annotation?

My solution is:

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


When you follow the JPA spec, you will note that there is no need to map tableC. You can just use a jointable

Something like this

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

if you want to map something in the JoinTable you can also define it as an Entity. You can map tableC like this

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

By making the objects insertable/updatable false, you can map the same properties multiple times. The other properties in the id are offcourse not updatable, because you would break your pk.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号