2016-03-23 10 views
0

私はpostgres dbを使用します。私は、ユーザーとuser_informationで、ユーザーはuser_informationへのリンクを持っている2つのテーブルを作成しました:JPA双方向マッピングを1対1で使用すると、エンティティを1つの直接エンティティから永続化できない

CREATE TABLE USERS(
    id    NUMERIC PRIMARY KEY DEFAULT NEXTVAL('users_id'), 
    password   TEXT NOT NULL, 
    email    TEXT NOT NULL UNIQUE, 
    phone    TEXT NOT NULL UNIQUE 
); 
CREATE TABLE USERS_INFORMATION(
    id  NUMERIC PRIMARY KEY DEFAULT NEXTVAL('users_information_id'), 
    user_id  NUMERIC UNIQUE REFERENCES USERS(ID) NOT NULL, 
    firs_name TEXT DEFAULT NULL, 
    last_name TEXT DEFAULT NULL, 
    SEX  TEXT DEFAULT NULL, 
    BIRTHDAY DATE DEFAULT NULL 
); 

、私はJPAエンティティの作成: ユーザー:

@Entity 

... 

public class User implements Serializable { 
    ... 

    public User() { 
    } 

    ... 

    @OneToOne(mappedBy="user", fetch=FetchType.LAZY) 
    public UsersInformation getUsersInformation() { 
     return this.usersInformation; 
    } 
} 

とuser_information:

@Entity 
... 
public class UsersInformation implements Serializable { 
    ... 
    @OneToOne(fetch=FetchType.LAZY, cascade=CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name="user_id") 
    public User getUser() { 
     return this.user; 
    } 

    ... 

} 

なぜ私をオブジェクトuser_informationオブジェクトを作成することができますオブジェクトのユーザーエンド使用永続化(user_informtion)とは仕事ですが、私はユーザーを作成し、user_informationをユーザーに設定し、p ersist(user)トランザクション例外ですか?どのように私はそれを修正することができます。 JPA eclipselink、ファサードやグラスフィッシュのようなejbを使用します。

+2

オブジェクト参照を両方向に設定するのを忘れましたか?私はそれに応じて 'setUserInformation(user)'と 'setUser(userInfo)'を呼び出すことを意味しますか? – coladict

+0

ありがとう、それは働いています) – JugerJuger

+0

@coladict、OPがそれを受け入れることができるように答えとしてあなたのコメントを配置してください。 – aribeiro

答えて

1

cascade-persistにするには、両方のオブジェクトが互いに持続する前にそれぞれuserInfo.setUserInformation(user)user.setUser(userInfo)を呼び出すことによって、両方のオブジェクトが互いに参照していることを確認する必要があります。ほとんどの場合、このようなデータモデルは必ずしも線形である必要はないので、JPAはその空白を自動的に記入しません。参照は、実際には複数のオブジェクトにわたってジグザグになる場合があります。これがお客様の要件に最も適しているとします。

関連する問題