2017-08-12 20 views
0
Entity(name = "Assignment") 
class Assignment { 
    @Id 
    private int id; 

    private String assignmentCode; 

} 

Entity(name = "Review") 
class Review { 
    @Id 
    private int id; 

    private String assignmentCode; 
} 

私は上記のように2列のテーブルをそれぞれ2つ持っています。 割り当てエンティティにレビューのリストを作成し、これらのレビューが列の割り当てコードで結合されます。割り当てにおいて同じ名前のHibernate One-To-Many JoinColumn

、Iは以下のように定義:

@OneToMany(targetEntity = Review.class, fetch=FetchType.EAGER) 
@JoinColumn(name="assignmentCode") 
private List<Review> reviews = new ArrayList<Review>(); 

私は割り当て割り当て= session.findById(Assignment.class、ID)を取得するとき、 例外が発生しました:com.microsoft.sqlserver.jdbc.SQLServerException:あいまいな列名 'assignmentCode'

レビューコレクションを定義するのはどうですか? 異なる列名を持つようにテーブル構造を変更することはできません。あなたがすべき

+0

あなたは何を@JoinColumn定義した場合(名前= "assignmentCode" を、テーブル= "your_Review_tableName_here")私は、既存のデータベースに取り組んでいる – dimitrisli

答えて

0

このため、正しい解決策である(https://forum.hibernate.org/viewtopic.php?f=1&t=1044726&start=0&sid=2e66d1aff1017f61f574f00e58836988

@Entity(name = "Assignment") 
class Assignment { 
    @Id 
    private int id; 

    private String assignmentCode; 

    @OneToMany(mappedBy = "assignment") 
    private List<Review> reviews = new ArrayList<Review>(); 

    public void addReview(Review review) { 
     reviews.add(review); 
     reviews.setPost(this); 
    } 

    public void removeReview(Review review) { 
     reviews.remove(review); 
     reviews.setAssignment(null); 
    } 

} 

@Entity(name = "Review") 
class Review { 
    @Id 
    private int id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(
     name = "assignmentCode", 
     referencedColumnName = "assignmentCode" 
    ) 
    private Assignment assignment; 
} 
0

  1. 名 "assignmentCode" とAssignment.assignmentCodeの前に列注釈(@Column)を追加(そしてこのannotaionのない他のフィールドのため)。
  2. クラスエンティティの前にテーブルアノテーションを追加します。
  3. テーブルステートメントをJoinColumnアノテーションに追加します。

最終的なコード:

@Entity 
@Table(name = "assignment") 
class Assignment { 
    @Id 
    private int id; 

    @Column(name="assignment_code") 
    private String assignmentCode; 

    @OneToMany(targetEntity = Review.class, fetch=FetchType.EAGER) 
    @JoinColumn(name="assignment_code", table="review") 
    private List<Review> reviews = new ArrayList<Review>(); 
} 

@Entity 
@Table(name = "review") 
class Review { 
    @Id 
    private int id; 

    @Column(name="assignment_code") 
    private String assignmentCode; 
} 
+0

ので、私列名を変更することはできません。だから私は@Column(name = "assignmentCode")を使ってこれらの変更を行った。 org.hibernate.cfg.NotYetImplementedException:セカンダリテーブルのFKを持つコレクション – jana

+0

次に、既存のdbスキームを参照する必要があります。 または、あなたのスキームに従ってアノテーションの名前を自分で変更できます(JoinColumn、Column、Table)。 –

+0

割り当て表: 列: ID、 AssignmentCode --- レビュー表: 列:*レビューを交換する ID、 AssignmentCode – jana

0

はあなたのエラーメッセージを見て、私は通常、私はassignment_codeのようなデータベースに何かの私のコラムに名前を付けます、あなたの列の名前は、あなたのJavaの変数名と異なっているからだと信じていますこの列は、レビューと割り当ての間で参加するための参照です。

私が最初に提案したのは、データベース列とJava変数の異なる名前付けについて正しい場合、より上に@Column(name = "assignment_code")を入れてください。

第2に、@OneToManyリレーションを定義するときに間違いがあると思います。 Assignmentクラスでこのようなことをします(コードから見て、単方向のようにしたいと思います)。

@OneToMany(cascade = CascadeType.ALL, fetch=FetchType.LAZY, orphanRemoval = true) 
@JoinColumn(name="assignment_code") 
private List<Review> reviews = new ArrayList<Review>(); 

リマインダー、@JoinColumnに名前が参照列名は、データベースにあったとないJavaの変数名

+0

Mineは既存のデータベースです。だから私は列名を変更することはできません – jana