Hibernate学习——(七)联合主键映射以及组件映射
2016-03-18 16:44
435 查看
一、联合主键映射
如果有时候需要将多个属性合并在一起作为主键,则需要使用使用联合主键映射的形式。
首先将联合主键需要的属性包装在一个class中:
ManagerPK.java:
之后在实体类中作关于联合主键的annotation:
Manager.java:(部分代码见下)
之后要对从表对应的实体类进行annotation设置:(部分代码见下)
在测试类中做如下测试:
在此处get方法中需要添加的是联合主键对象m_PK,否则会报主键对象不匹配的错误。
二、组件映射
在Hibernate中,组件是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),组件是一个被包含的对象
他作为值类型被持久化,而非一个实体。利用组件映射,可以将存在映射关系的两个类对应的字段放在同一张表中。
在附加的类中,去掉@Entity,@Id等annotation标记,注意其不能有主键,同时注意不能有命名上的冲突。
之后,在被附加的类上加上新的Annotation标记:
同时注意在hibernate.cfg.xml文件中不能有附加组件的mapping声明,只有实体类的mapping声明。
采用组件映射的优点:实现了对象细粒度的划分,层次更加分明,复用率高。上面的student类,分为了基本信息id、name,
还将联系方式作为contact类分离了出来,此外,还可以将爱好等信息再作为一类分离出来,这是我理解的细粒度的划分。分离出来
的联系方式和爱好等,也可以作为其他对象(例如teacher、employer等)的组件,这样就为用提供了方便。
如果有时候需要将多个属性合并在一起作为主键,则需要使用使用联合主键映射的形式。
首先将联合主键需要的属性包装在一个class中:
ManagerPK.java:
package cn.wqy.dao; import java.io.Serializable; public class ManagerPK implements Serializable{ private int manager_id; private String manager_name; public int getManager_id() { return manager_id; } public void setManager_id(int manager_id) { this.manager_id = manager_id; } public String getManager_name() { return manager_name; } public void setManager_name(String manager_name) { this.manager_name = manager_name; } }注意这里要继承Serializable接口,bean类必须序列化。
之后在实体类中作关于联合主键的annotation:
Manager.java:(部分代码见下)
@IdClass(ManagerPK.class) public class Manager { private int manager_id; private String manager_name; private String manager_password; @Id public int getManager_id() { return manager_id; } @Id public String getManager_name() { return manager_name; }
} ...
之后要对从表对应的实体类进行annotation设置:(部分代码见下)
@OneToOne @JoinColumns({ @JoinColumn(name = "Man_Id", referencedColumnName = "manager_id"), @JoinColumn(name = "Man_Name", referencedColumnName = "manager_name") }) public Manager getManager() { return manager; }
在测试类中做如下测试:
@Test public void testManagerSave() { ManagerPK m_PK = new ManagerPK(); Manager m = new Manager(); Manager_Msg msg = new Manager_Msg(); Session s = HibernateSessionFactory.getSession(); Transaction tran = s.beginTransaction(); m_PK.setManager_id(1); m_PK.setManager_name("王qy"); m = (Manager) s.get(Manager.class, m_PK); msg.setManager_id(1); msg.setManager_name("王qy"); msg.setManager(m); System.out.println(msg.getManager().getManager_password()); tran.commit(); s.close(); }
在此处get方法中需要添加的是联合主键对象m_PK,否则会报主键对象不匹配的错误。
二、组件映射
在Hibernate中,组件是某个实体的逻辑组成部分,它与实体的根本区别是没有oid(对象标识符),组件是一个被包含的对象
他作为值类型被持久化,而非一个实体。利用组件映射,可以将存在映射关系的两个类对应的字段放在同一张表中。
在附加的类中,去掉@Entity,@Id等annotation标记,注意其不能有主键,同时注意不能有命名上的冲突。
之后,在被附加的类上加上新的Annotation标记:
@Embedded public Manager getManager() { return manager; }
同时注意在hibernate.cfg.xml文件中不能有附加组件的mapping声明,只有实体类的mapping声明。
采用组件映射的优点:实现了对象细粒度的划分,层次更加分明,复用率高。上面的student类,分为了基本信息id、name,
还将联系方式作为contact类分离了出来,此外,还可以将爱好等信息再作为一类分离出来,这是我理解的细粒度的划分。分离出来
的联系方式和爱好等,也可以作为其他对象(例如teacher、employer等)的组件,这样就为用提供了方便。
相关文章推荐
- 短粗和细长
- Ubuntu/centos/redhat/SUSE sipp安装(带rtp支持,3.5.1版本)
- Android中广播接收者BroadcastReceiver详解
- LeetCode: Roman to Integer
- 插入排序
- 【Linux】shell字符串分割、数组访问、条件判断
- android RecyclerView 实现瀑布流带图库浏览效果
- JS 利用appendChild对<li>标签进行排序
- Retrofit的分析以及实现步骤
- 如何在Linux下创建新的交换空间swap的方法
- Linux进程通信-信号学习
- 搜狐设计师:我从产品经理转为交互设计师的经验总结
- HashMap实现原理分析
- 用三种方式取出给定字符串中的目标字串
- 奖券数目
- 第四周项目1-求最大公约数(1)
- android studio改变主题字体大小
- iOS 随记
- Oracle学习笔记2 ---- 连接数据库
- 【实例】 python数据库编程