文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
基于外键
介绍
对于基于外键的 1-1 关联,外键可以存放在任意一边。需要存放外键的一端,需要增加 <many-to-one.../>
元素,并且为 <many-to-one.../>
元素增加 unique="true"
属性来表示该实体实际上是 1 的一端。 <many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>
对于 1-1 的关联关系,两个实体原本处于平等状态,但当我们选择任意一个表来增加外键后(增加 <many-to-one.../>
元素的实体端),该表即变成从表,而另一个表则成为主表。
另一端需要使用 <one-to-one.../>
元素,该 <one-to-one.../>
元素需要使用 name 属性指定关联属性名。为了让系统不再为本表增加一列,而是使用外键关联,使用 property-ref
属性指定引用关联类的属性。 <one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
代码
实体类
public class Department {
private Integer deptId;
private String deptName;
private Manager manager;
//省去 get 和 set
}
public class Manager {
private Integer mgrId;
private String mgrName;
private Department department;
//省去 get 和 set
}
Manager.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
<class name="Manager" table="MANAGERS">
<id name="mgrId" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property>
<!-- 映射 1-1 的关联关系,在对应的数据表中已经有外键,当前持久花类使用 ont-to-one 进行映射 -->
<one-to-one name="department" class="Department" property-ref="manager"></one-to-one>
</class>
</hibernate-mapping>
Department.hbm.xml
<hibernate-mapping package="com.lihui.hibernate.double_1_1.foreign">
<class name="Department" table="DEPARTMENTS">
<id name="deptId" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="native" />
</id>
<property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property>
<many-to-one name="manager" class="Manager" column="MGR_ID" unique="true"></many-to-one>
</class>
</hibernate-mapping>
测试
@Test
public void testGet(){
Department dep = (Department) session.get(Department.class, 1);
System.out.println(dep.getDeptName());
Manager mgr =dep.getManager();
System.out.println(mgr.getMgrName());
}
@Test
public void testSave() {
Department dep = new Department();
dep.setDeptName("a");
Manager mgr = new Manager();
mgr.setMgrName("b");
dep.setManager(mgr);
mgr.setDepartment(dep);
session.save(mgr);
session.save(dep);
}
Notice
上面的映射策略可以互换,即让 Manager 存放外键,使用 <many-to-one.../>
元素映射关联属性;但 Department 端则必须使用 <one-to-one.../>
元素映射,万万不可两边都使用相同的元素映射关联属性。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论