2012-05-03 36 views
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; 
    } 
} 

然後,我有另一種支持類

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

什麼我有一個問題是映射器類,Account.hbm.xml它看起來像

<?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> 

我我確信這個XML文件是罪魁禍首,但我不知道如何以正確的方式做到這一點。所以,我會感謝你的幫助。

+0

我覺得這篇文章可以幫助: http://stackoverflow.com/ question/6405746/mapping-manytomany-with-composite-primary-key-and-annotation –

回答

1

使用<composite-id>而不是<id>,例如像這樣:

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

順便說一句,你不能使用發電機的複合ID。你必須自己生成身份證。 (無論如何,對於一個複合鍵發電機通常沒有什麼意義哪一個關鍵組成部分,應該產生和時間。?)

+0

感謝你們的回覆,但是正如我已經從我已經閱讀的內容中理解的那樣,複合密鑰就是當存在基數關係時在兩個或更多實體之間。此外,我可以在我的實體上使用「@CompositeId」註釋嗎?在我的情況中,只有一個表不應該在其兩列中具有相同的數據組合。建議'@EmbeddedId'方式是hibernate社區中很多人的好方法;只有當我知道如何配置它。 – Abraham

+0

'composite-id>'當您的主鍵由兩列或多列組成時,您總是可以使用。不一定有基數關係。 - 不要問我註釋,我從不使用它們,但你可能會發現一些信息[這裏](http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177) 。 Xml映射文件似乎是更簡單的解決方案。 – Johanna