共享的主键关联:
由主键关联而相关的两张表中的行共享相同的主键值。这种方法的主要困难在于,确保被关联的
实例在保存对象时分配了相同的主键值。
第一步:用xml映射主键关联
第二步:外标识符生成器
如果Address实例被保存,它就需要获取User对象的主键值。你无法启动一个常规的标示符生成器,
假设是数据库序列。用于Address的这个特殊的foreign标示符生成器,必须知道从哪里获取正确
的主键值。
创建Address和User之间的这个标示符绑定,起第一步是双向关联。把一个新的user属性添加
到Address属性:
这个映射让关联变成了双向,constrained="true"声明了把address的主键添加到user主键的外键约束。
现在可以给Address对象使用特殊的foreign标示符生成器了:
(当Address被保存时,从属性中提取主键值。user属性是对User对象的一个引用;因而,插入的主键值与
这个实例的主键值相同。)
需要双向才可以保存成功:
利用注解的共享主键:
JPA用@OneToOne注解支持一对一的实体关联。要映射User类中address的关联为共享主键关联,还需要@PrimaryKeyJoinColumn注解:
JPA规范没有包括处理共享主键生成问题的标准方法,这意味着在保存Address实例的标示符之前,你要负责正确的设置他。
hibernate的扩展注解:
保存:
由主键关联而相关的两张表中的行共享相同的主键值。这种方法的主要困难在于,确保被关联的
实例在保存对象时分配了相同的主键值。
第一步:用xml映射主键关联
- <class name="User"
- ....
- <one-to-one name="address" class="Address" cascade="update">
- </one-to-one>
第二步:外标识符生成器
如果Address实例被保存,它就需要获取User对象的主键值。你无法启动一个常规的标示符生成器,
假设是数据库序列。用于Address的这个特殊的foreign标示符生成器,必须知道从哪里获取正确
的主键值。
创建Address和User之间的这个标示符绑定,起第一步是双向关联。把一个新的user属性添加
到Address属性:
- <class name="Address"
- ...
- <one-to-one name="user" class="User" constrained="true"/>
这个映射让关联变成了双向,constrained="true"声明了把address的主键添加到user主键的外键约束。
现在可以给Address对象使用特殊的foreign标示符生成器了:
- <class name="Address" table="ADDRESS">
- <id name="addressId" column="ADDRESS_ID" type="long">
- <generator class="foreign">
- <param name="property">user</param>
- </generator>
- </id>
- <property name="street" type="string" column="street"/>
- <property name="city" type="string" column="city"/>
- <one-to-one name="user" class="User" constrained="true"/>
- </class>
(当Address被保存时,从属性中提取主键值。user属性是对User对象的一个引用;因而,插入的主键值与
这个实例的主键值相同。)
需要双向才可以保存成功:
- User user = new User();
- user.setUserName("test");
- Address address = new Address("street", "city");
- user.setAddress(address);
- //不添加报错:attempted to assign id from null one-to-one property: user
- address.setUser(user);
- Integer msgId = (Integer) session.save(user);
利用注解的共享主键:
JPA用@OneToOne注解支持一对一的实体关联。要映射User类中address的关联为共享主键关联,还需要@PrimaryKeyJoinColumn注解:
- @Entity
- public class User implements Serializable {
- @Id
- @GeneratedValue
- private Integer userId;
- @Column(name="USER_NAME",length=100)
- private String userName;
- @OneToOne(cascade=CascadeType.PERSIST)
- @PrimaryKeyJoinColumn
- private Address address;
JPA规范没有包括处理共享主键生成问题的标准方法,这意味着在保存Address实例的标示符之前,你要负责正确的设置他。
hibernate的扩展注解:
- @Entity
- public class Address implements Serializable {
- @Id
- @GeneratedValue(generator="userForeignGenerator")
- @org.hibernate.annotations.GenericGenerator(name="userForeignGenerator",
- strategy="foreign",
- parameters=@Parameter(name="property",value="user"))
- @Column(name="ADDRESS_ID")
- private Integer addressId;
- private String street;
- private String city;
- @OneToOne
- private User user;
保存:
- User user = new User("name");
- Address address = new Address("street", "city");
- user.setAddress(address);
- //不添加报错:attempted to assign id from null one-to-one property: user
- address.setUser(user);
- em.persist(user);