0

私は eclipselink が初めてで、manyTomany 関連付けテーブルに余分な列を追加しようとしています。

そこで、@ManyToMany 関係を置き換えるために、2 つの @OneToMany と @ManyToOne を使用することにしました。

次のリンクで休止状態の方法を試しましたが、機能しません。 http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-annotation/

これをeclispelinkで構築する方法を知っている人はいますか?

ありがとう

-------------------------上記のリンクをたどって、テストコードを貼り付けてください --------------

サイド A:

@Entity
@Table(name = "SideA")
    public class SideA {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long  id;

    private List<ABAssociation> association = new ArrayList<ABAssociation>();


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.sideA", cascade=CascadeType.ALL)
    public List<ABAssociation> getAssociation() {
          return this.association;
    }

    public void setAssociation(List<ABAssociation> association) {
    this.association = association;
    }

}

サイド B:

@Entity
@Table(name = "SideB")
public class SideB {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long  id;


    private List<ABAssociation> association = new ArrayList<ABAssociation>();


    @OneToMany(fetch = FetchType.LAZY, mappedBy = "pk.sideB", cascade=CascadeType.ALL)
    public List<ABAssociation> getAssociation() {
        return this.association;
    }

    public void setAssociation(List<ABAssociation> association) {
        this.association = association;
    }

}

協会:

@Entity
@Table(name = "ABAssociation")
@AssociationOverrides({
   @AssociationOverride(name = "pk.sideA", 
    joinColumns = @JoinColumn(name = "SIDEA_ID")),
   @AssociationOverride(name = "pk.sideB", 
    joinColumns = @JoinColumn(name = "SIDEB_ID")) })
public class ABAssociation {
   private ABAssociationPK pk = new ABAssociationPK();
   @EmbeddedId
   public ABAssociationPK getPk() {
        return pk;
   }
   public void setPk(ABAssociationPK pk) {
       this.pk = pk;
   }
   @Transient
   public SideA getSideA() {
       return getPk().getSideA();
   }
   public void setSideA(SideA sideA) {
       getPk().setSideA(sideA);
   }
   @Transient
   public SideB getSideB() {
       return getPk().getSideB();
   }
   public void setSideB(SideB sideB) {
       getPk().setSideB(sideB);
   } 
   private String extracolumn;
}

ABAssociationPK:

@Embeddable
public class ABAssociationPK implements java.io.Serializable{
    private static final long serialVersionUID = -3797694126054440157L;

    private SideA sideA;
    private SideB sideB;
    public ABAssociationPK(){}

    @ManyToOne
    public SideA getSideA() {
        return sideA;
    }

    public void setSideA(SideA sideA) {
        this.sideA = sideA;
    }

    @ManyToOne
    public SideB getSideB() {
        return sideB;
    }

    public void setSideB(SideB sideB) {
        this.sideB = sideB;
    }

}

例外は次のとおりです。Exception Description: Predeployment of PersistenceUnit [testPU] failed. Internal Exception: Exception [EclipseLink-7298] (Eclipse Persistence Services - 2.3.2.v20111125-r10461): org.eclipse.persistence.exceptions.ValidationException Exception Description: The mapping [sideA] from the embedded ID class [class com.fuhu.nabisync.resource.model.entity.ABAssociationPK] is an invalid mapping for this class. An embeddable class that is used with an embedded ID specification (attribute [pk] from the source [class com.fuhu.nabisync.resource.model.entity.ABAssociation]) can only contain basic mappings. Either remove the non basic mapping or change the embedded ID specification on the source to be embedded.

4

1 に答える 1

3

メッセージは非常に明確です。

組み込み ID 仕様で使用される組み込み可能クラスには、基本マッピングのみを含めることができます。

したがって、ABAssociationPK クラス内に ManyToOne アソシエーションを含めることはできません。

これを行う標準的な JPA の方法は、@MapsIdアノテーションを使用することです。javadoc は役立つ例を提供します。特定の状況では、クラスにはタイプ:とABAssociationPKの 2 つのフィールドが含まれ、基本的な列としてマップされます。longaIdbId

The Association entity should contain the associations, and use the @MapsId annotation:

@ManyToOne
@MapsId("aId")
public SideA getSideA() {
    return sideA;
}

@ManyToOne
@MapsId("bId")
public SideB getSideB() {
    return sideB;
}
于 2012-05-16T08:15:58.200 に答える