親テーブルに1つの主キーがあり、子テーブルに複合主キーがある親テーブルと子テーブルの関係があります。ただし、子テーブルの列のうち1つのみが親テーブルを参照しています。Hibernate ManyToOneとリストの問題
親表
@Entity
@Table(name = "snippet")
public class SnippetEntity implements Serializable{
private static final long serialVersionUID = -3220451853395334879L;
@Id
@Column(name = "snpt_id", nullable=false, updatable=false)
@JsonBackReference
private String snippetId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "cretn_ts")
private Date creationTimeStamp;
@Column(name = "cretn_user_id")
private String creationUserId;
public String getSnippetId() {
return snippetId;
}
public void setSnippetId(String snippetId) {
this.snippetId = snippetId;
}
public Date getCreationTimeStamp() {
return creationTimeStamp;
}
public void setCreationTimeStamp(Date creationTimeStamp) {
this.creationTimeStamp = creationTimeStamp;
}
public String getCreationUserId() {
return creationUserId;
}
public void setCreationUserId(String creationUserId) {
this.creationUserId = creationUserId;
}
@Override
public String toString() {
return "SnippetEntity{" +
"snippetId='" + snippetId + '\'' +
'}';
}
}
子テーブル
:私の休止状態のクラスはのようなアップ配線されているすべてsnippet_detail
を得るために
@Entity
@Table(name = "snippet_detail")
public class SnippetDetailEntity implements Serializable {
private static final long serialVersionUID = -7470223455753164243L;
@Id
@Column(name = "lang_cd", nullable=false, updatable=false)
private String language;
@Column(name = "snpt_type_cd")
private String snippetType;
@Column(name = "snpt_desc")
private String snippetDescription;
@Column(name = "snpt_txt")
private String snippetText;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "cretn_ts")
private Date creationTimeStamp;
@Column(name = "cretn_user_id")
private String creationUserId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updt_ts")
private Date updatedTimeStamp;
@Column(name = "updt_user_id")
private String updatedUserId;
@ManyToOne
@JoinColumn(name="snpt_id")
@JsonManagedReference
private SnippetEntity snippetEntity;
public SnippetDetailEntity() {}
public String getLanguage() {
return language;
}
public void setLanguage(String language) {
this.language = language;
}
public String getSnippetType() {
return snippetType;
}
public void setSnippetType(String snippetType) {
this.snippetType = snippetType;
}
public String getSnippetDescription() {
return snippetDescription;
}
public void setSnippetDescription(String snippetDescription) {
this.snippetDescription = snippetDescription;
}
public String getSnippetText() {
return snippetText;
}
public void setSnippetText(String snippetText) {
this.snippetText = snippetText;
}
public Date getCreationTimeStamp() {
return creationTimeStamp;
}
public void setCreationTimeStamp(Date creationTimeStamp) {
this.creationTimeStamp = creationTimeStamp;
}
public String getCreationUserId() {
return creationUserId;
}
public void setCreationUserId(String creationUserId) {
this.creationUserId = creationUserId;
}
public Date getUpdatedTimeStamp() {
return updatedTimeStamp;
}
public void setUpdatedTimeStamp(Date updatedTimeStamp) {
this.updatedTimeStamp = updatedTimeStamp;
}
public String getUpdatedUserId() {
return updatedUserId;
}
public void setUpdatedUserId(String updatedUserId) {
this.updatedUserId = updatedUserId;
}
public SnippetEntity getSnippetEntity() { return snippetEntity; }
public void setSnippetEntity(SnippetEntity snippetEntity) { this.snippetEntity = snippetEntity; }
@Override
public String toString() {
return "SnippetDetailEntity{" +
"language='" + language + '\'' +
", snippetType='" + snippetType + '\'' +
", snippetDescription='" + snippetDescription + '\'' +
", snippetText='" + snippetText + '\'' +
", creationTimeStamp=" + creationTimeStamp +
", creationUserId='" + creationUserId + '\'' +
", updatedTimeStamp=" + updatedTimeStamp +
", updatedUserId='" + updatedUserId + '\'' +
", snippetEntity=" + snippetEntity +
'}';
}
}
コールは次のとおりです。
List<SnippetDetailEntity> snippetEntities = dbService.getAll(SnippetDetailEntity.class);
public <T> List<T> getAll(Class<T> clazz) {
return getSession().createCriteria(clazz).list();
}
は378件のレコードがsnippet_detail
にあります。だから私の問題は、snippet_detail
からすべての行を取得するリストを作成すると、snippet_detail
から2つの一意のレコード(このテーブルの主キーに一致する最初の2つ)が得られ、これらのレコードは複数回複製されます。レコードの総数はまだ378ですが、これらの378レコードは、複数回複製された2つのレコードで構成されています。私は完全に混乱していると私はこれはおそらく冬眠の私の理解のために認めているこれはなぜ起こっているのですか?私は多くの記事を読んでおり、彼らはすべて冬眠について話して、outer join
をしています。私がやっている何か悪いことはありますか?もしそうなら、私はこれを修正するために何をしますか?
UPDATE:私は休止状態で、それは@Embeddable
注釈を使用することを処理するために、私のsnippet_detail
と方法で複合キーを持っていることに気づいたいくつかのより多くのブログやポストを通じて読む
。 snpt_id
とlang_cd
を持つ@Embeddable
クラスを作成しました。 snippet_detail
エンティティクラスを変更して@Embeddable
クラスを使用しました。また、私はこれを考え出したので、私は(結合条件を指定する必要がどこ@ManyToOne
が@Embeddable
クラスにジョイン移動すなわちsnippet_detail
のsnpt_id
とsnippet
テーブルのsnpt_id
。
今は、細かな作品をフェッチ間しかし、私がsnippet_detail
に挿入すると、参照キー制約に違反しているため、挿入を実行できないというハイバネートエラーが発生します。オリジナルの投稿にあるクラスでは、@ManyToOne
は子クラス内にありました。その場合、スニペットテーブルにレコードが存在しない場合、子ステーブルへの挿入によって親スニペットテーブルにレコードが挿入されます。
私の親テーブルクラスは上記と同じです。
@Embeddable
public class SnippetDetailPrimaryEntity implements Serializable {
@ManyToOne
@JoinColumn(name = "snpt_id")
private SnippetEntity snippetEntity;
@Column(name = "lang_cd")
private String language;
}
@Entity
@Table(name = "snippet_detail")
public class SnippetDetailEntity implements Serializable {
@EmbeddedId
private SnippetDetailPrimaryEntity snippetDetailPrimaryEntity;
@Column(name = "snpt_type_cd")
private String snippetType;
@Column(name = "snpt_desc")
private String snippetDescription;
@Column(name = "snpt_txt")
private String snippetText;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "cretn_ts")
private Date creationTimeStamp;
@Column(name = "cretn_user_id")
private String creationUserId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "updt_ts")
private Date updatedTimeStamp;
@Column(name = "updt_user_id")
private String updatedUserId;
}
表!私が見ることができるのは1つだけですか? –
@AtimeneNazim 'snpt_id'と 'lang_cd'は私の子テーブルの主キーです。 –
親のmanytooneマッピングのため、私は子供のhibernateクラスでsnpt_idを定義しませんでした。 –