2016-07-12 21 views
1

私は以下の2つのクラス(およびそれらのpkクラス)をこれらのアノテーションとともに使用しています。私はセッター/ゲッター/ハッシュコードは/例多対多JPA Hibernateマッピング複合キーの結合テーブルエラー

私は最終的にこのエラー

org.hibernate.MappingException: Repeated column in mapping for collection: com.stackOverflow.Features.thingCategory column: YEARを取得していますを圧縮するために等しい削除

私の推測では、「年」は、結合テーブルに共有されているので、私はめちゃめちゃているということです私のエンティティを関連付けるための構文をいくつか作成します。これらは、エンティティ間の暗黙の関係を持つビューであり、注釈でモデル化しようとしているビューです。モデリング後に同じエラーが表示されるJPAモデリングツールをいくつか試しました。私は、insertableupdatableからfalseに結合列を設定しようとしました。

私はもちろんSQLクエリを書くことはできますが、これはHibernateで私にとってどれほど難しいかには本当に驚きました。

機能エンティティ

@Entity 
@Table(name = "myTableOfFeatures") 
public class Feature { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private FeatureKey id; 

    @Column(name="displayText") 
    private String description; 

    //bi-directional many-to-many association 
    @ManyToMany 
    @JoinTable(
      name="joinTableToThingCategories" 
      , joinColumns={ 
      @JoinColumn(name="name", referencedColumnName="name", insertable = false, updatable = false), 
      @JoinColumn(name="year", referencedColumnName="year", insertable = false, updatable = false) 
    } 
      , inverseJoinColumns={ 
      @JoinColumn(name="year", referencedColumnName="year", insertable = false, updatable = false), 
      @JoinColumn(name="title", referencedColumnName="title", insertable = false, updatable = false) 
    } 
    ) 
    private List<ThingCategory> thingCategory; 

    public Feature() { 
    } 
    // ... gets and sets 

} 
@Embeddable 
public class FeatureKey implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    @Column(name="name") 
    private String myName; 

    private String year; 

    public FeatureKey() { 
    } 
    // ... gets and sets and equals and hashes 
} 

ThingCategoryエンティティ

@Entity 
@Table(name = "CategoriesOfThings") 
public class ThingCategory implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private ThingCategoryKey id; 

    private String comment; 

    //bi-directional many-to-many association to categories 
    @ManyToMany(mappedBy="thingCategory") 
    private List<Feature> features; 

    public ThingCategory() { 
    } 
    // ... gets and sets 
} 
@Embeddable 
public class ThingCategoryKey implements Serializable { 
    //default serial version id, required for serializable classes. 
    private static final long serialVersionUID = 1L; 

    private String year; 

    @Column(name="categoryName") 
    private String title; 

    public ThingCategoryKey() { 
    } 
    // ... gets and sets and equals and hashes 
} 
+0

わかりません。 @MapsId( "myName")と@MapsId( "title")を追加することができます。これを確認してくださいhttp://stackoverflow.com/questions/16775055/hibernate-embeddedid-join 私はそれが役立つことを教えてください。 – mariusz2108

+0

助けてくれてありがとう!その宣言をどこに追加しますか?関係について? – TheNorthWes

+0

いいえ、@MapsIdで動作しません – mariusz2108

答えて

0

これはJPA 2.1仕様の一例です。 私はそれが助けてくれることを願っています。

@Entity 
public class Employee { 
    @Id int id; 
    @Embedded ContactInfo contactInfo; 
    ... 
} 


@Embeddable 
public class ContactInfo { 
    @ManyToOne Address address; // Unidirectional 
    @ManyToMany List<PhoneNumber> phoneNumbers; // Bidirectional 
} 

@Entity 
public class PhoneNumber { 
    @Id int phNumber; 

    @ManyToMany(mappedBy="contactInfo.phoneNumbers")   
    Collection<Employee> employees; 
} 

この仕様を強くお勧めします。 JPA 2.1

+0

これは複合主キーの複雑さを結合テーブルの共有列でカプセル化しているとは思いません。 – TheNorthWes

0

これは機能するかもしれませんが、私は自分自身を試していません。だから私はこれをコメントとして書こうと思っていましたが、コードをコメントとして書くのは面倒です。あなたがそれを試してみるといいかもしれません(試してみる時間がないのは申し訳ありません)。それが動作しない場合は私にコメントを残して、私はそれを削除します。

@JoinTable(
     name="joinTableToThingCategories", 
     joinColumns={ 
      @JoinColumn(name="feature_name", referencedColumnName="name", insertable = false, updatable = false), 
      @JoinColumn(name="feature_year", referencedColumnName="year", insertable = false, updatable = false) 
     }, 
     inverseJoinColumns={ 
      @JoinColumn(name="tcat_year", referencedColumnName="year", insertable = false, updatable = false), 
      @JoinColumn(name="tcat_title", referencedColumnName="title", insertable = false, updatable = false) 
     } 
) 
private List<ThingCategory> thingCategory; 
+0

私はこの仕事をしているようには見えませんでしたが、JPAアノテーションで多くの呪文を試してみませんでした。それは私が右(または間違った)道を下ってしまった、そして私は私の結合テーブルの年の列を複製しました。ホム・ハム – TheNorthWes

関連する問題