2012-10-11 60 views
1

我真的被困在我的項目中使用Hibernate。我在這裏描述的一些問題:Hibernate: getting too many rows我開始想知道我的代碼是否正確。我正在研究一個巨大的項目,我必須自己定義帶有註釋的映射類。但是當問題開始出現時,我決定重新創建與該項目分開的部分數據庫,並嘗試在IDE中生成實體。這是否正確(更好)的對象關係映射?

我有兩個表:MyOptionMy有主鍵:列qwertypropertyProperty是來自Option表的外鍵。當然Optionproperty作爲主鍵。

在我的解決方案中,我創建了@EmbeddableMyPK類,具有兩個屬性:String qwertyString property。在我的My實體當然我有@EmbeddedIdMyPKproperty(與MyPK相同的列名稱),但是這是Option對象,而不是在MyPK中的字符串。

@ManyToOne 
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false) 
protected Option option; 

這是由Intellij Idea中的Hibernate Tools生成的實體。沒有EmbeddedId,但有@IdClass。我以爲@IdClass只適用於基本類型。但我有一個對象作爲我的主鍵的一部分。但是這裏也有OptionEntity對象。這是正確的保持一列的基本類型和對象類型?

@javax.persistence.IdClass(test.go.MyEntityPK.class) 
@javax.persistence.Table(name = "MY", schema = "PUBLIC", catalog = "PUBLIC") 
@Entity 
public class MyEntity { 
    private String qwerty; 

    @javax.persistence.Column(name = "QWERTY") 
    @Id 
    public String getQwerty() { 
     return qwerty; 
    } 

    public void setQwerty(String qwerty) { 
     this.qwerty = qwerty; 
    } 

    private String text; 

    @javax.persistence.Column(name = "TEXT") 
    @Basic 
    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    private String lang; 

    @javax.persistence.Column(name = "PROPERTY") 
    @Id 
    public String getProperty() { 
     return property; 
    } 

    public void setProperty(String property) { 
     this.property= property; 
    } 

    @Override 
    public boolean equals(Object o) { 
     //equals 
    } 

    @Override 
    public int hashCode() { 
     //hashCode 
    } 

    private OptionEntity optionByProperty; 

    @ManyToOne 
    @javax.persistence.JoinColumn(name = "PROPERTY", referencedColumnName = "PROPERTY", nullable = false) 
    public OptionEntity getOptionByProperty() { 
     return optionByProperty; 
    } 

    public void setOptionByProperty(OptionEntity optionByProperty) { 
     this.optionByProperty = optionByProperty; 
    } 
} 

這是MyEntityPK生成的類:

public class MyEntityPK implements Serializable { 
    private String qwerty; 

    @Id 
    @Column(name = "qwerty") 
    public String getQwerty() { 
     return qwerty; 
    } 

    public void setQwerty(String qwerty) { 
     this.qwerty = qwerty; 
    } 

    private String property; 

    @Id 
    @Column(name = "PROPERTY") 
    public String getProperty() { 
     return property; 
    } 

    public void setProperty(String property) { 
     this.property = property; 
    } 

    @Override 
    public boolean equals(Object o) { 
     //equals 
    } 

    @Override 
    public int hashCode() { 
     //hashCode 
    } 
} 

下面OptionEntity。這個實體沒有特別的要點。我只想@Version註釋version財產和List<MyEntity>而不是Collection<MyEntity>

@javax.persistence.Table(name = "OPTION", schema = "PUBLIC", catalog = "PUBLIC") 
@Entity 
public class OptionEntity { 
    private Long version; 

    @javax.persistence.Column(name = "VERSION") 
    @Basic 
    public Long getVersion() { 
     return version; 
    } 

    public void setVersion(Long version) { 
     this.version = version; 
    } 

    private String property; 

    @javax.persistence.Column(name = "PROPERTY") 
    @Id 
    public String getProperty() { 
     return property; 
    } 

    public void setProperty(String property) { 
     this.property = property; 
    } 

    @Override 
    public boolean equals(Object o) { 
     //equals 
    } 

    @Override 
    public int hashCode() { 
     //hashcode 
    } 

    private Collection<MyEntity> myByProperty; 

    @OneToMany(mappedBy = "optionByProperty") 
    public Collection<MyEntity> getMyByProperty() { 
     return myByProperty; 
    } 

    public void setMyByProperty(Collection<MyEntity> myByProperty) { 
     this.myByProperty = myByProperty; 
    } 
} 

什麼樣的選擇是最合適的,問題更少?我描述過的還是粘貼的那個?

回答

1

擺脫財產private String lang;/private String property;它已被許多人定義。你也不需要MyEntity主鍵的類。 MyEntity可以是它自己的id類,它的兩個屬性qwertyoption作爲它的關鍵屬性key-manytoone。

+0

我必須在這個靈魂'@ Id'註釋中使用嗎? – woyaru

+0

我不是那麼流利的註釋,但我認爲你需要在每個keyproperty/reference上加上@ @ Id – Firo

1

查看使用派生ID的JPA 2.0示例: http://wiki.eclipse.org/EclipseLink/Examples/JPA/2.0/DerivedIdentifiers 這似乎是你在做什麼之後。

在JPA中,你不需要爲你的ID使用embeddedId,但是如果使用組合PK,你確實需要一個類來保存組成PK的多個值。這個類的實例被傳遞給em.find方法,它可以是EmbeddedId或PKClass。我更喜歡自己使用PKClass,但它取決於您 - 使用嵌入式只是將字段放置在可嵌入類中,因此您可以使用嵌入式對象來設置映射並訪問值。如果使用pkClass,則不需要在其中註釋的字段/屬性,因爲它們是直接在實體內訪問和映射的。

+0

但是我也在使用Hibernate。所以這不是同一個問題,是嗎? – woyaru