您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

hibernate 映射继承关系

2024/4/27 2:43:04发布10次查看
实现方式一般有三种: 1. 继承关系树每个具体类对应一张表(不介绍) 2. 继承关系树的根类对应一张表 3. 继承关系树的每个类对应一张表 先介绍关系: dayemployee和monthemploy是employee的子类,并且company和employee是一对多关系: 具体代码如下: compan
实现方式一般有三种:
1. 继承关系树每个具体类对应一张表(不介绍)
2. 继承关系树的根类对应一张表
3. 继承关系树的每个类对应一张表
先介绍关系:
dayemployee和monthemploy是employee的子类,并且company和employee是一对多关系:
具体代码如下:
company.java
import java.util.hashset;import java.util.set;public class company { private integer id; private string name; private set employees = new hashset(); public company() { super(); } public company(string name) { super(); this.name = name; } public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public set getemployees() { return employees; } public void setemployees(set employees) { this.employees = employees; }}
employee.java
public class employee { private integer id; private string name; private integer age; private company company; public company getcompany() { return company; } public void setcompany(company company) { this.company = company; } public integer getid() { return id; } public void setid(integer id) { this.id = id; } public string getname() { return name; } public void setname(string name) { this.name = name; } public integer getage() { return age; } public void setage(integer age) { this.age = age; }}
dayemployee.java
public class dayemployee extends employee{ private double daymoney; public double getdaymoney() { return daymoney; } public void setdaymoney(double daymoney) { this.daymoney = daymoney; }}
monthemploy.java
public class monthemploy extends employee{ private double monthmoney; public double getmonthmoney() { return monthmoney; } public void setmonthmoney(double monthmoney) { this.monthmoney = monthmoney; }}
company.hbm.xml

继承关系树的根类对应一张表对应的employee.hbm.xml的写法
employee.hbm.xml

利用上述代码作如下测试:
public class employeetest { sessionfactory sessionfactory = null; session session = null; transaction transaction = null; @before public void init() { configuration configuration = new configuration().configure(); serviceregistry serviceregistry = new serviceregistrybuilder().applysettings(configuration.getproperties()) .buildserviceregistry(); sessionfactory = configuration.buildsessionfactory(serviceregistry); session = sessionfactory.opensession(); transaction = session.begintransaction(); } @after public void after() { transaction.commit(); session.close(); sessionfactory.close(); } @test public void testemployee() { company company = new company(com1); dayemployee d1 = new dayemployee(); d1.setage(22); d1.setdaymoney(50.0); d1.setname(d1); monthemploy d2 = new monthemploy(); d2.setage(30); d2.setmonthmoney(79.0); d2.setname(d2); employee employee = new employee(); employee.setage(90); employee.setname(employee); d1.setcompany(company); d2.setcompany(company); employee.setcompany(company); //inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联// company.getemployees().add(employee);// company.getemployees().add(d1);// company.getemployees().add(d2); //把一的一段放到最前保存,可以减小3条更新操作 session.save(company); session.save(employee); session.save(d2); session.save(d1); }}
会得出如下结果:
继承关系树的每个类对应一张表employee.hbm.xml的写法

测试代码:
public class employeetest { sessionfactory sessionfactory = null; session session = null; transaction transaction = null; @before public void init() { configuration configuration = new configuration().configure(); serviceregistry serviceregistry = new serviceregistrybuilder().applysettings(configuration.getproperties()) .buildserviceregistry(); sessionfactory = configuration.buildsessionfactory(serviceregistry); session = sessionfactory.opensession(); transaction = session.begintransaction(); } @after public void after() { transaction.commit(); session.close(); sessionfactory.close(); } @test public void testemployee() { company company = new company(com1); dayemployee d1 = new dayemployee(); d1.setage(22); d1.setdaymoney(50.0); d1.setname(d1); monthemploy d2 = new monthemploy(); d2.setage(30); d2.setmonthmoney(79.0); d2.setname(d2); employee employee = new employee(); employee.setage(90); employee.setname(employee); d1.setcompany(company); d2.setcompany(company); employee.setcompany(company); //inverse = true 时可以关联, 当相对多出3条update,因此建议使用多的一端关联// company.getemployees().add(employee);// company.getemployees().add(d1);// company.getemployees().add(d2); //把一的一段放到最前保存,可以减小3条更新操作 session.save(company); session.save(employee); session.save(d2); session.save(d1); } @test public void findfromemployeetable(){ string hql = from employee; //通过左外链接找 list list = session.createquery(hql).list(); for (employee emp : list){ if (emp instanceof dayemployee){ system.out.println(day); } else if (emp instanceof monthemploy){ system.out.println(mon); } else { system.out.println(emp); } } } @test public void findfromdayemployeetable(){ string hql = from dayemployee; //通过内连接找 list list = session.createquery(hql).list(); system.out.println(list.size()); }}
得出如下结果:
结论:
1.使用根类对应一张表
好处:只需创建一张表,不用外键关联
缺点:如果子类属性多,会导致另一子类有过多的空值,而且不能设置一些字段的not null约束,因此不能保证数据库的完整性
2.每个类对应一张表(外键关联)
好处:如果某个类的属性发生变化,只需修改和这个类对应的表
缺点:利用外键关联查询
ref:
孙卫琴.精通hibernate:java对象持久化技术详解
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录