2017-10-07 8 views
0

親テーブルに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 + '\'' + 
       '}'; 
    } 
} 

子テーブル

:私の休止状態のクラスはのようなアップ配線されている

enter image description here

すべて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_idlang_cdを持つ@Embeddableクラスを作成しました。 snippet_detailエンティティクラスを変更して@Embeddableクラスを使用しました。また、私はこれを考え出したので、私は(結合条件を指定する必要がどこ@ManyToOne@Embeddableクラスにジョイン移動すなわちsnippet_detailsnpt_idsnippetテーブルの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; 
} 
+0

表!私が見ることができるのは1つだけですか? –

+0

@AtimeneNazim 'snpt_id'と 'lang_cd'は私の子テーブルの主キーです。 –

+0

親のmanytooneマッピングのため、私は子供のhibernateクラスでsnpt_idを定義しませんでした。 –

答えて

0

ので、親テーブルは、単一の主キーを持つ親子関係のために、子供が複合キーを持っており、子供のキーのいずれかがある場合:として新しい@Embeddableクラスと私の子供のクラスが変更されました親に戻って参照制約、これは私のために働いたものです。組み込みとして

@Entity 
@Table(name = "snippet") 
public class SnippetEntity implements Serializable{ 

    private static final long serialVersionUID = -3220451853395334879L; 

    @Id 
    @Column(name = "snpt_id", nullable=false, updatable=false) 
    private String snippetId; 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "cretn_ts") 
    private Date creationTimeStamp; 

    @Column(name = "cretn_user_id") 
    private String creationUserId; 
} 

子供の複合キー:あなたは子供で2つのIDについて話

@Embeddable 
public class SnippetDetailPrimaryEntity implements Serializable{ 

    @Column(name = "snpt_id") 
    private String snippetId; 

    @Column(name = "lang_cd") 
    private String language; 
} 

子供

@Entity 
@Table(name = "snippet_detail") 
public class SnippetDetailEntity implements Serializable { 

    private static final long serialVersionUID = -7470223455753164243L; 

    @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; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="snpt_id", insertable = false, updatable = false) 
    private SnippetEntity snippetEntity; 
} 
関連する問題