2012-02-09 17 views
2

これは私が変えられない構造のレガシーシステムで働いているという事実から生まれた奇妙なシナリオです。多対多の関係を持つ要素のHibernate/JPAコレクション?

重要なフィールド「タイプ」と「値」を持つ要素に関するさまざまなデータが含まれている要素テーブルがあります。

タイプと値のさまざまな組み合わせが分類されます。たとえば、タイプ2のすべての要素と値「緑」がカテゴリ1に属しています。

私はレガシーシステムにユーザーがこれらのカテゴリを定義するためのユーザーインターフェイスを構築しています。 。私が望むのは、レガシーシステムが休止状態のエンティティに一連のカテゴリを含めることです。 Categoryは実際にElementCategory型の列挙型です。私の払い戻しの1つは、レガシーアプリケーションが自分のスキーマを定義するものでなければならないため、テーブルを作成する必要があるということです。私は新しいフロントエンドを作成するときにそのデータベース を使用します。ここで私は私の要素エンティティ内の私の新しいコレクションを注釈を付けてきた方法は次のとおりです。

@CollectionOfElements(fetch=FetchType.EAGER,targetElement = ElementCategory.class) 
@JoinTable(name = "Element_Category",joinColumns = 
    {@JoinColumn(name = "type", referencedColumnName="type" 
    @JoinColumn(name = "value", referencedColumnName="value")   
    }) 
@Column(name="category") 
@Enumerated(EnumType.STRING) 
public List<ElementCategory> getCategories() { 
    return categories; 
} 

問題は、私は、サーバーを起動したときに作成されています要素テーブルが正しくない(タイプ、値)、上の固有の制約を持っていることです同じタイプと値のフィールドを持つ複数の要素が存在する可能性があり、element_categoryテーブルの見た目に応じて、同じカテゴリまたはカテゴリに属します。

私が知っていることは、何度も設定することですが、私のことは知っていますが、私の要素カテゴリフィールドにカテゴリエンティティのコレクションが含まれていない限り、多くを使用することはできますが、それは単なる列挙型。

これは、休止状態で達成できますか?

このような私の要素Entityクラスでこれをマッピングする
@Entity 
@Table(name="ElementCategory") 
public class ElementCategory implements Serializable{ 
private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 

private String description; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id =id; 
} 


public String getDescription() { 
    return description; 
} 

public void setDescription(String description) { 
    this.description = description; 
} 


/* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    int hash = 1; 
    hash = hash * (17 + id); 
    hash = hash * 31 + description.hashCode(); 
    return hash; 
} 

/* 
* (non-Javadoc) 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
@Override 
public boolean equals(Object obj) { 
    if(this == obj) { 
     return true; 
    } 
    if(!super.equals(obj)) { 
     return false; 
    } 
    if(getClass() != obj.getClass()) { 
     return false; 
    } 
    ElementCategory other = (ElementCategory)obj; 

    return ((other.id == id) && (this.description.equals(other.description))); 
} 

}

@ManyToMany(fetch = FetchType.EAGER) 
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = { 
     @JoinColumn(name = "type", referencedColumnName = "type"), 
     @JoinColumn(name = "value", referencedColumnName = "value") }) 
@Column(name = "category") 
public List<ElementCategory> getCategories() { 
    return categories; 
} 

私が持っている、私は別のアプローチを試してみましたが、ElementCategoryエンティティを作成し、この問題に続き

ショップの上に$ unique = false $を置いてみましたが、生成されたテーブルはまだ私のElementテーブルでこれで終わります。

CONSTRAINT element_type_value_key UNIQUE (type , value) 

私はそれが一意であることを望んでいません。複数の要素がその構成を持つことができます。

+0

だから私は、私はエンティティにでElementCategoryを作り、(罰金である)データベースに私のデータを保存しなければならなかった、この問題に対する答えを見つけることができ始めるなし関係をManyToManyにしました。そして、Hibernateは型と値のペアについて一意の制約を持つElementテーブルを作成しています。私はそれが "多対多"に相当する方法を理解していないし、それをオフにする方法を見つけることはできません。助けてください? – Link19

+0

ElementCategoryエンティティにidプロパティを追加すると、まだ一意ではありませんか? – bvanvelsen

+0

はい、@ idでアノテーションされたidプロパティは既にあります。 1つの要素だけがその特定のペアを持つことが許されていると判断された場合、これは多対多の関係であるとは思われません。 – Link19

答えて

0

あなたはこのような何かを試みることができる:

@JoinTable(name = "Element_Category", 
joinColumns = {@JoinColumn(name = "type_id") }, 
inverseJoinColumns = { @JoinColumn(name = "elementcategory_id") } 
) 
public List<ElementCategory> getCategories() { 
    return categories; 
} 
+0

申し訳ありませんが、私のカテゴリはElementの "value"と "type"のペアに基づいてElementに与えられています。答えはどのようになっていますか? – Link19

+0

これは私の新しい問題をよりよく説明しています:http://stackoverflow.com/questions/9228005/hibernate-jpa-many-to-many-relationship-through-a-join-table-and-a-composite-k – Link19