プロジェクトでHibernateを使用することに本当に行き詰まりました。ここで説明したいくつかの問題: Hibernate: 取得する行数が多すぎます。自分のコードが正しいかどうか疑問に思い始めました。私は巨大なプロジェクトに取り組んでおり、自分で注釈付きのマッピング クラスを定義する必要がありました。しかし、問題が発生し始めたとき、プロジェクトとは別にデータベースの一部を再作成し、IDE でエンティティを生成しようとしました。
と の 2 つのテーブルがMy
ありOption
ます。My
主キー: columnqwerty
およびがありproperty
ます。テーブルProperty
からの外部キーです。Option
もちろん、主キーとしてOption
持っています。property
私のソリューションでは、 と の 2 つのプロパティを持つクラスを作成し@Embeddable
MyPK
ました。私のエンティティではもちろんと( と同じ列名) がありますが、このオブジェクトは のように String ではなく、です。String qwerty
String property
My
@EmbeddedId
MyPK
property
MyPK
Option
MyPK
@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;
これは、Intellij Idea の Hibernate Tools によって生成されたエンティティです。ありませんEmbeddedId
が、あります@IdClass
。@IdClass
私はそれが基本的なタイプだけだと思っていました。しかし、主キーの一部としてオブジェクトがあります。しかし、ここにもOptionEntity
目的があります。基本型とオブジェクト型を 1 つの列に保持するのは正しいですか?
@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;
}
}
最も適切で問題の少ないオプションはどれですか? 私が説明したもの、または貼り付けたもの?