簡體   English   中英

如何在JPA 2中創建映射為Entity類的3或4方式多對多關聯

[英]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 Aclass B ,我映射為ABMap 我在class C class Dclass 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  
}

現在,讓我們說,我們要改變ABMapACDMap其中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_DEntity和一個使用同一表的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM