Если цель состоит в том, чтобы иметь общий первичный ключ , что по этому поводу (вдохновленный примером Java Persistence With Hibernate и протестированный в базе данных домашних животных):
@Entity
public class User {
@Id
@GeneratedValue
private Long id;
@OneToOne(cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn
private Address shippingAddress;
//...
}
Это родительский класс, который вставляется первым и получает сгенерированный идентификатор. Address
выглядит так:
@Entity
public class Address implements Serializable {
@Id @GeneratedValue(generator = "myForeignGenerator")
@org.hibernate.annotations.GenericGenerator(
name = "myForeignGenerator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "user")
)
@Column(name = "ADDRESS_ID")
private Long id;
@OneToOne(mappedBy="shippingAddress")
@PrimaryKeyJoinColumn
User user;
//...
}
С вышеуказанными объектами, кажется, следующее ведет себя как ожидалось:
User newUser = new User();
Address shippingAddress = new Address();
newUser.setShippingAddress(shippingAddress);
shippingAddress.setUser(newUser); // Bidirectional
session.save(newUser);
При сохранении Address
вставляемое значение первичного ключа совпадает со значением первичного ключа экземпляра User
, на который ссылается свойство user
.
Загрузка User
или Address
также просто работает.
Дайте мне знать, если я что-то пропустил.
PS: Чтобы строго ответить на вопрос, согласно Первичные ключи через отношения OneToOne :
JPA 1.0 не допускает @Id для OneToOne или ManyToOne, но JPA 2.0 разрешает.
Но , совместимая с JPA 1.0 версия Hibernate
позволяет использовать аннотацию @Id
при отображении OneToOne
или ManyToOne
*.
Я не смог заставить это работать с Hibernate EM 3.4 (он работал с Hibernate EM 3.5.1, то есть реализацией JPA 2.0). Может я что то не так сделал.
В любом случае, использование общего первичного ключа, кажется, обеспечивает правильное решение.