[英]How to create 3 or 4 way many-to-many association mapped as Entity class in JPA 2
我正在使用spring 3.1,hibernate 4.0.1.FINAL和spring-data-jpa 1.0.2.RELEASE。 所以我們可以說我有many-to-many
之間的class A
和class B
,我映射為ABMap
。 我在class C
class D
和class D
之間還有另一個映射為CDMap
。 我有一個類ABMapID
注釋@Embeddable
@Embeddable
public class ABMapID{
private String aID;
private String bID;
}
//... setters and getters
所以映射本身在下面
@Entity
public class ABMap {
@Id
@AttributeOverrides({
@AttributeOverride(name = "aID", column = @Column(name = "a_id",insertable = false, updatable = false)),
@AttributeOverride(name = "bID", column = @Column(name = "b_id", insertable = false,updatable = false))
})
private ABMapID ID;
@ManyToOne(targetEntity = A.class)
@JoinColumn(name = "a_id",insertable = false,updatable = false)
private A a;
@ManyToOne(targetEntity = B.class)
@JoinColumn(name = "b_id", insertable = false, updatable = false)
private B b;
//.... setters and getters
}
現在,讓我們說,我們要改變ABMap
到ACDMap
其中ACDMapID
由與援助,並CDMapID(它本身是由與CID,DID)。 所以我的新關聯ID是ACDMapID
@Embeddable
public class ACDMapID {
private String aID;
private CDMapID cdmapID;
}
and the entity is mapped like so
@Entity
public class ACDMap {
@Id
@AttributeOverrides({
@AttributeOverride(name = "aID", column = @Column(name = "a_id",insertable = false, updatable = false)),
@AttributeOverride(name = "cdmapID", column = @Column(name = "dcmap_id", insertable = false,updatable = false))
})
private ACDMapID ID;
}
所以運行這個給我這個錯誤
原因:org.hibernate.AnnotationException:從ACDMap引用CDMap的外鍵的列數錯誤。 應該是2
有沒有辦法做這種映射? 最好我想保持CDMap這樣。
我以為可以試試看,結果是這樣(沒有嘗試過,所以純粹是理論上的)。
@Entity
public class A
{
@Id
private Long id;
@ManyToMany
@JoinTable(name = "A_B", joinColumns={
@JoinColumn(name = "a_id")
}, inverseJoinColumns = {
@JoinColumn(name = "b_id")
})
private Collection<B> collectionOfB;
@ManyToMany
@JoinTable(name = "A_C_D", joinColumns={
@JoinColumn(name ="a_id")
}, inverseJoinColumns = {
@JoinColumn(name = "c_id"),
@JoinColumn(name = "d_id")
})
private Collection<ACD> collectionOfCD;
}
@Entity
public class B
{
@Id
private Long id;
@ManyToMany(mappedBy = "collectionOfB")
private Collection<A> collectionOfA;
}
@Entity
public class C
{
@Id
private Long id;
@ManyToMany
@JoinTable(name = "C_D", joinColumns={
@JoinColumn(name = "c_id")
}, inverseJoinColumns = {
@JoinColumn(name = "d_id")
})
private Collection<D> collectionOfD;
}
@Entity
public class D
{
@Id
private Long id;
@ManyToMany(mappedBy = "collectionOfD")
private Collection<C> collectionOfC;
}
@Entity
@Table(name = "C_D")
public class CD
{
@EmbeddedId
private CDPK key;
@MapsId("cId")
@ManyToOne
private C c;
@MapsId("dId")
@ManyToOne
private D D;
}
@Embeddable
public class CDPK
{
@Column(name = "c_id")
private Long cId;
@Column(name = "d_id")
private Long dId;
}
我真的不確定這是否C_D
,因為有一個使用表C_D
的Entity
和一個使用同一表的JoinTable
。
如果工作正常,數據庫將如下所示:
| A | | A_B | | B |
| id |------<| a_id | b_id |>-----| id |
|
|
| | A_C_D |
\----<| a_id | c_id | d_id |
\/ \/
| |
| |
| C | | C_D | | D |
| id |----<| c_id | d_id |>-----| id |
您似乎不了解JPA的概念。 您不應該以編程方式處理ID,而是處理對象。
您需要基於可嵌入對象中的ID的動態關聯。 普通的Hibernate也許可以實現這種構造,但是JPA中肯定沒有這種構造。
JPA的全部目的是讓您處理對象,而不是數據庫關系。 一旦您開始將這兩個方面混合在一起,地獄就會崩潰,因此JPA人士決定不支持此類混合,我也不能怪他們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.