2012-05-03 2 views
2

私は、2つのフィールドを主キー(一緒に)として使用するEntityクラスを持っています。ここに私がしようとしているものがあります。私はすでにデータベースを持っていますので、このパスをたどり、単一の主キーを作成するだけではいけません。2つのフィールドを休止状態で一意のIDとして使用する

@Entity 
public class Account { 
    private String description; 
    private AccountPk id; 

    public Account (String description) { 
    this.description = description; 
    } 

    protected Account() { 
    } 

    @EmbeddedId 
    public AccountPk getId() { 
     return this.id; 
    } 
    public String getDescription() { 
     return this.description; 
    } 
    public void setId(AccountPk id) { 
     this.id = id; 
    } 
    public void setDescription(String description) { 
     this.description = description; 
    } 
} 

その後、私は私が

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 
<class 
name="hello.Account" 
table="MESSAGES"> 
<id 
name="id" 
column="MESSAGE_ID"> 
<generator class="increment"/> 
</id> 
<property 
name="description" 
column="DESCRIPTION"/> 
</class> 
</hibernate-mapping> 

のように見えたAccount.hbm.xml、私は問題を抱えていることはマッパークラスである

public class AccountPk { 
    private String code; 
    private Integer number; 
    public AccountPk() { 
    } 

    public String getCode() { 
     return this.code; 
    } 
    public Integer getNumber() { 
     return this.number; 
    } 

    public void setNumber(Integer number) { 
     this.number = number; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public int hashCode() { 
     int hashCode = 0; 
     if(code != null) hashCode ^= code.hashCode(); 
     if(number != null) hashCode ^= number.hashCode(); 
     return hashCode; 
    } 

    public boolean equals(Object obj) { 
     if(!(obj instanceof AccountPk)) return false; 
     AccountPk target = (AccountPk)obj; 
     return ((this.code == null) ? 
     (target.code == null) : 
     this.code.equals(target.code)) 
     && ((this.number == null) ? 
     (target.number == null) : 
     this.number.equals(target.number)); 
    } 
} 

別の支持クラスを持っていますこのxmlファイルが原因だと確信していますが、正しい方法でこれを行う方法はわかりません。だから、私はあなたの助けに感謝します。このような例のための代わりに<id>

+0

私はこの記事を助けることができると思う: http://stackoverflow.com/質問/ 6405746 /マッピング - 複合主キーと注釈を持つmanytomany –

答えて

1

使用<composite-id>、:

<composite-id> 
    <key-property name="firstId" column="FIRST_ID_COL" type="..." /> 
    <key-property name="secondId" column="SECOND_ID_COL" type="..." /> 
</composite-id> 

ところで、あなたは、複合IDで発電機を使用することはできません。自分でidを生成する必要があります。 (とにかく、複合キーのための発電機は、通常、意味がありません、それは時に生成しなければならない重要なコンポーネントのどちら?)

+0

あなたの返事をお寄せいただきありがとうございますが、私がすでに読んでいることから理解しているように、複合キーは基数関係がある場合です2つ以上のエンティティの間。また、エンティティで使用できる@CompositeIdアノテーションはありません。私の場合は、2つの列に同じデータの組み合わせを持つことは想定されていないテーブルが1つだけです。 「@EmbeddedId」の方法は、休止状態のコミュニティの多くの人が良い方法であることを示唆しています。私はそれを設定する方法を知っている場合のみ。 – Abraham

+0

'composite-id>'主キーが2つ以上の列で構成されている場合は、常に使用できます。カーディナリティの関係は必ずしも必要ではありません。 - 注釈について私に聞かないでください、私はそれらを使用しませんが、あなたはいくつかの情報[ここ](http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177)を見つけるかもしれません。 。 Xmlマッピングファイルは、より簡単な解決策のようです。 – Johanna

関連する問題