hibernate 一对一的外键关联

来源:互联网 发布:淘宝消保工具是什么 编辑:程序博客网 时间:2024/05/20 00:13
一对一的外键关联: 
不共享主键,而是两表可以有一个外键关系。一张表有着引用被关联表的主键的一个外键列。 
view plaincopy to clipboardprint?
  1. <class name="User" table="USER" dynamic-insert="true" dynamic-update="true"   
  2.         mutable="false">  
  3. <id name="userId" column="USER_ID" type="integer">  
  4.     <generator class="native"/>  
  5. </id>  
  6. <property name="userName" type="string" column="user_Name"/>  
  7. <!-- 在User里面添加维护信息,也就是把User作为维护端 -->  
  8. <many-to-one name="address" class="Address"  
  9.     column="ADDRESS_ID" unique="true" cascade="save-update"/>   

(这里用的many-to-one,而不是我们共享主键里面的one-to-one,因为:你不在乎关联的目标端是什么, 
因此可以像对待没有多端的対一关联对待他。通过unique来强制说明只存在一的对应关系) 
反向属性引用: 
view plaincopy to clipboardprint?
  1. <class name="Address" table="ADDRESS">  
  2.     <id name="addressId" column="ADDRESS_ID" type="integer">  
  3.         <generator class="native">  
  4.         </generator>  
  5.     </id>  
  6.     <property name="street" type="string" column="street"/>  
  7.     <property name="city" type="string" column="city"/>  
  8.     <!-- property-ref="address"告诉hibernateAddress -->  
  9.     <!-- 基于外键的的唯一约束,一般不建议这么做,这个是不需要的 -->  
  10.     <one-to-one name="user" class="User" property-ref="address"/>  

插入: 
view plaincopy to clipboardprint?
  1. Address address = new Address("street""city");  
  2.   
  3. user.setAddress(address);  
  4. //不需要  
  5.         address.setUser(user);  
  6.   
  7. Integer msgId = (Integer) session.save(user);         




通过注解映射外键: 
JPA映射注解也支持基于外键列的实体之间的一对一关系。与前面的非实体类型的区别就是,@JoinColumn替代了 
view plaincopy to clipboardprint?
  1. @PrimaryKeyJoinColumn.        
  2. @Entity  
  3. public class User implements Serializable {  
  4.     @Id  
  5.     @GeneratedValue  
  6.     private Integer userId;  
  7.     @Column(name="USER_NAME",length=100)  
  8.     private String userName;  
  9.     @OneToOne(cascade=CascadeType.PERSIST)  
  10.     //加入一个外键关联字段  
  11.     @JoinColumn(name="ADDRESS_ID")  
  12.     private Address address  

如果需要双向的: 
view plaincopy to clipboardprint?
  1. @Entity  
  2. public class Address implements Serializable {  
  3.     @Id  
  4.     @GeneratedValue  
  5.     @Column(name="ADDRESS_ID")        
  6.     private Integer addressId;  
  7.     private String street;  
  8.     private String city;  
  9.     //如果需要双向的  
  10.     //表示被User里面的address字段进行关联管理  
  11.     //mappedBy相当于xml的property-ref="address"(关联的一个简单的方向声明,就是在目标实体段指定了一种属性)  
  12.     //加上他,在数据库上是没有任何影响的,紧紧是告诉JPA容器一种关系  
  13.     @OneToOne(mappedBy="address")  
  14.     private User user;