私はUser.id
とAddress.user_id
列1対1の関係を持つ2つのテーブルに作成JPA:OneToOne関係の所有者
によって2つのモデル間の関係を作りたい:
ここ@Entity()
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "id", referencedColumnName = "user_id")
private Address address;
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
@Entity
@Table(name = "address")
public class Address extends com.mezoline.domain.common.Entity {
@Id
@GeneratedValue
private int id;
@OneToOne(mappedBy = "address")
private User user;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
を私はすでに見ることができます問題:hibernateがデータベース列Address.user_id
をどのように生成しなかったか
私はAddress
インスタンスを作成し、User
にそれを追加します。
User user = entityManager.find(User.class, 69);
Address address = new Address();
address.setCity("Тест");
userTransaction.begin();
user.setAddress(address);
entityManager.merge(user);
userTransaction.commit();
を私はmerge(user)
を呼び出した後。関係のない情報が保存されました。
UPD:以下の設定で
、JPAは関係列Address.user_id(ちょうど関係の所有者がスワップされた)
public class User {
...
@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
private Address address;
...
}
public class Address {
....
@OneToOne()
@JoinColumn(name = "user_id")
private User user;
....
}
を作成しますが、保存Address.user_idはnullです後...(他の列が充填されている)
UPD2:
ありがとう。逆側の関係フィールド(コメントで提案されているように)設定された第二の設定作業罰金、:
Address address = createAddress();
address.setUser(user);
user.setAddress(address);
をしかし、私は理解し `tを、(ユーザーが所有側である)なぜ最初に設定ドン`t仕事。
ええと、ありがとう。私はJPAが自分自身を管理していると思った..(AOP) – Hett