0

spring 3.1、hibernate 4.0.1.FINAL、および spring-data-jpa 1.0.2.RELEASE を使用しています。many-to-manyでは、 と の間に があり、 としてマッピングしたclass Aとしましょう。また、 と の間に別の多対多が あり、としてマップされます。@Embeddable アノテーションが付けられたクラスがありますclass BABMapclass Cclass DCDMapABMapID

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

ここで、 を aID で構成される場所に変更しABMap、CDMapID (それ自体は cID、dID で構成される) に変更するとします。私の新しい関連付けIDはACDMapIDですACDMapACDMapID

 @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 をそのままにしておきたいということです。

4

2 に答える 2

1

私はそれを試してみようと思いました、これが結果です(まだ試していなかったので、純粋に理論的です)。

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

EntityテーブルC_DJoinTable使用と同じテーブルの使用があるので、これが機能するかどうかは本当にわかりません。

それが機能する場合、データベースは次のようになります。

| 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 |
于 2012-06-11T23:12:35.807 に答える
0

JPAの概念を理解していないようです。プログラムでIDを処理するのではなく、代わりにオブジェクトを処理してください。

埋め込み可能なオブジェクトの ID に基づく動的な関連付けが必要です。おそらく、そのような構成はプレーンな Hibernate で可能ですが、JPA にはありません。

JPA の要点は、データベース関係ではなく、オブジェクトを処理できるようにすることです。これらの 2 つの側面を混ぜ合わせ始めるとすぐに地獄が崩壊するので、JPA の人々はそのような混合物をサポートしないことに決めました。私は彼らを責めることはできません。

于 2012-06-11T10:47:02.570 に答える