2016-04-11 23 views
0

Hibernateの学習。 Hibernate OneToOneテーブル結合

 public class User { 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "first_name") 
    Private String firstName; 
    @Column(name = "last_name") 
    private String lastName; 
    @OneToOne(fetch = FetchType.EAGER) 
    @JoinTable(name = "user_country_region", joinColumns ={@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "country_id") }) 
    private Country userCountry; 

    @OneToOne(fetch = FetchType.EAGER) 
    @JoinTable(name = "user_country_region", joinColumns = {@JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "region_id") }) 
    private Region userRegion; 

    //With its respective Getters and Setters 
    } 

    public class Country { 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "name") 
    private String name; 

    //With its respective Getters and Setters 
    } 

    public class Region { 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    @Column(name = "name") 
    private String name; 

    //With its respective Getters and Setters 
    } 

問題が直面しています次のように私は、国を以下のクラスのユーザー、リージョンを持っていることは休止状態クエリは領域だけではなく国を返すです。これを引き起こす原因は何ですか?

は、Hibernateを表示するSQLから

System.out.println("Country: "+user.getCountry().getName()); 
    System.out.println("Region: "+user.getRegion().getName()); 

レスポンス以下のように国と地域の値を取得しようとしました。国の詳細が不足しているようだ。

Hibernate: 
    select 
     this_.id as id1_3_3_, 
     this_.first_name as first_na2_3_3_, 
     this_.last_name as last_na3_3_3_, 
     region2_.id as id1_8_2_, 
     region2_.name as name2_8_2_ 
    from 
     user this_ 
    left outer join 
     user_country_region this_1_ 
     on this_.id=this_1_.user_id 
    left outer join 
    region region2_ 
     on this_1_.region_id=region2_.id 
    where 
    this_.id=? 
+0

テーブルの名前を確認してください。 user_country_region、user_coutnry_region?どちらも正しいですか?基本的なことから始めるだけですか? – LearningPhase

+0

はい、同じです。テーブル内のフィールドはuser_id、country_id、region_idのようになります。この表は3つを結合します。 –

+0

は、ユーザー国と地域をどのように初期化しようとしていたかで質問を更新しました。 –

答えて

0

JoinTableの名前にタイプミスがあった可能性があります。 あなたは同じテーブルだと言っていますが、user_country_region <> user_coutnry_region

+0

申し訳ありませんが、質問のタイプミスです。ちょうどそれを修正しました。それが問題だった場合はエラーが発生します:relation "user_coutnry_region"は存在しません –

1

無効なマッピングです。私はHibernateでスキーマを作成している間、このエラーをHibernate 5に持っています。

org.hibernate.boot.spi.InFlightMetadataCollector$DuplicateSecondaryTableException: 
Table with that name [user_country_region] already associated with entity 

とにかく、あなたは2人の関係のために結合テーブルにマッピングのような種類を持つ、あなたのHibernateのバージョンでこのマッピングを使用することができるかどうか発生しやすいエラーです。

このマッピングを使用して、UserCountryRegionに外部キー列で関連付けます。

public class User { 

    @OneToOne 
    private Country country; 

    @OneToOne 
    private Region region; 

    } 
+0

他の解決策が存在しないようです。これで動作する必要があります。 –

+0

OneToOneから@ManyToManyに変更すると動作します。どうやって?よく分からない。 –

関連する問題