扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
Spring与Hibernate整合的关键点:
成都创新互联于2013年成立,是专业互联网技术服务公司,拥有项目网站设计、网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元江城做网站,已为上家服务,为江城各地企业和个人服务,联系电话:135182197921) Hibernate的SessionFactory对象交给Spring创建;
2) Hibernate事务交给Spring的声明式事务管理。
Spring和Hibernate整合的步骤:
1)引入jar包
2)配置:hibernate.cfg.xml、*.hbm.xml、applicationContext.xml
3)搭建环境、单独测试
hibernate3相关jar包
hibernate3.jar
antlr-2.7.6.jar (required)
commons-collections-3.1.jar (required)
dom4j-1.6.1.jar (required)
javassist-3.12.0.GA.jar (required)
jta-1.1.jar (required)
slf4j-api-1.6.1.jar (required)
hibernate-jpa-2.0-api-1.0.0.Final.jar (jpa)
spring-core相关jar包
commons-logging-1.2.jar
spring-beans-3.2.5.RELEASE.jar
spring-context-3.2.5.RELEASE.jar
spring-core-3.2.5.RELEASE.jar
spring-expression-3.2.5.RELEASE.jar
spring-aop相关jar包
aopalliance-.jar
aspectjrt.jar
aspectjweaver.jar
spring-aop-3.2.5.RELEASE.jar
spring-jdbc相关jar包
spring-jdbc-3.2.5.RELEASE.jar
spring-tx-3.2.5.RELEASE.jar 【事务相关】
spring-orm相关jar包
spring-orm-3.2.5.RELEASE.jar 【spring对hibernate的支持】
c3p0相关jar包
c3p0-0.9.1.2.jar
mysql相关jar包
mysql-connector-java-5.1.38-bin.jar
hibernate.cfg.xml
Dept.hbm.xml
Dept.java
package com.rk.entity; public class Dept { private int deptId; private String deptName; private int deptVersion; public int getDeptId() { return deptId; } public void setDeptId(int deptId) { this.deptId = deptId; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public int getDeptVersion() { return deptVersion; } public void setDeptVersion(int deptVersion) { this.deptVersion = deptVersion; } @Override public String toString() { return "Dept [deptId=" + deptId + ", deptName=" + deptName + ", deptVersion=" + deptVersion + "]"; } }DeptDao.java
package com.rk.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import com.rk.entity.Dept; public class DeptDao { private static SessionFactory sf; static { sf = new Configuration().configure().buildSessionFactory(); } public Dept findById(int id) { Session session = sf.getCurrentSession(); session.beginTransaction(); Dept dept = (Dept) session.get(Dept.class, id); session.getTransaction().commit(); return dept; } public void save(Dept dept) { Session session = sf.getCurrentSession(); session.beginTransaction(); session.save(dept); session.getTransaction().commit(); } }DeptService.java
package com.rk.service; import com.rk.dao.DeptDao; import com.rk.entity.Dept; public class DeptService { private DeptDao deptDao = new DeptDao(); public Dept findById(int id) { return deptDao.findById(id); } public void save(Dept dept) { deptDao.save(dept); } }App.java
package com.rk.test; import org.junit.Test; import com.rk.entity.Dept; import com.rk.service.DeptService; public class App { @Test public void test() { DeptService deptService = new DeptService(); // Dept dept = deptService.findById(3); // System.out.println(dept); Dept dept = new Dept(); dept.setDeptName("HelloWorld"); deptService.save(dept); } }
applicationContext.xml (添加)
App.java (修改)
@Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); Dept dept = (Dept) ac.getBean("dept"); System.out.println(dept); }
其中,hibernate.cfg.xml、Dept.hbm.xml、Dept.java三个文件没有发生变化。
DeptDao.java (修改)
package com.rk.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.rk.entity.Dept; public class DeptDao { private SessionFactory sf; public void setSf(SessionFactory sf) { this.sf = sf; } public Dept findById(int id) { Session session = sf.getCurrentSession(); session.beginTransaction(); Dept dept = (Dept) session.get(Dept.class, id); session.getTransaction().commit(); return dept; } public void save(Dept dept) { Session session = sf.getCurrentSession(); session.beginTransaction(); session.save(dept); session.getTransaction().commit(); } }DeptService.java (修改)
package com.rk.service; import com.rk.dao.DeptDao; import com.rk.entity.Dept; public class DeptService { private DeptDao deptDao; public void setDeptDao(DeptDao deptDao) { this.deptDao = deptDao; } public Dept findById(int id) { return deptDao.findById(id); } public void save(Dept dept) { deptDao.save(dept); } }applicationContext.xml (修改)
App.java (修改)
package com.rk.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.rk.entity.Dept; import com.rk.service.DeptService; public class App { @Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); DeptService deptService = (DeptService) ac.getBean("deptService"); Dept dept = deptService.findById(3); System.out.println(dept); Dept newDept = (Dept) ac.getBean("dept"); newDept.setDeptName("HelloWorld"); deptService.save(newDept); } }其中,Dept.hbm.xml和Dept.java没有发生改变。
DeptDao.java (修改)
package com.rk.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.rk.entity.Dept; public class DeptDao { private SessionFactory sf; public void setSf(SessionFactory sf) { this.sf = sf; } public Dept findById(int id) { Session session = sf.getCurrentSession(); Dept dept = (Dept) session.get(Dept.class, id); return dept; } public void save(Dept dept) { Session session = sf.getCurrentSession(); session.save(dept); } }DeptService.java (修改)
在save方法中,加入了int i = 1/0;所以会出错,而save方法处于事务当中,因此两条数据不会保存成功。如果去掉错误,两条数据就可以保存成功了。
package com.rk.service; import com.rk.dao.DeptDao; import com.rk.entity.Dept; public class DeptService { private DeptDao deptDao; public void setDeptDao(DeptDao deptDao) { this.deptDao = deptDao; } public Dept findById(int id) { return deptDao.findById(id); } public void save(Dept dept) { deptDao.save(dept); int i = 1/0; Dept newDept = new Dept(); newDept.setDeptName("HAHA_LLO"); deptDao.save(newDept); } }hibernate.cfg.xml (修改)
修改的只有一行:删除或注释下面的配置
否则,会报错误:org.hibernate.HibernateException: 方法 is not valid without active transaction。
applicationContext.xml (修改)
App.java (没有变化,进行测试)
package com.rk.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.rk.entity.Dept; import com.rk.service.DeptService; public class App { @Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); DeptService deptService = (DeptService) ac.getBean("deptService"); Dept dept = deptService.findById(3); System.out.println(dept); Dept newDept = (Dept) ac.getBean("dept"); newDept.setDeptName("HelloWorld"); deptService.save(newDept); } }这里只涉及到修改hibernate.cfg.xml和applicationContext.xml
hibernate.cfg.xml 中删除以下内容:
applicationContext.xml中添加dataSource和修改sessionFactory
完整的hibernate.cfg.xml
完整的applicationContext.xml
换句话说,就是删除hibernate.cfg.xml,只保留applicationContext.xml文件
applicationContext.xml
applicationContext.xml
Dept.hbm.xml
Dept.java
package com.rk.entity; public class Dept { private int deptId; private String deptName; private int deptVersion; public int getDeptId() { return deptId; } public void setDeptId(int deptId) { this.deptId = deptId; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public int getDeptVersion() { return deptVersion; } public void setDeptVersion(int deptVersion) { this.deptVersion = deptVersion; } @Override public String toString() { return "Dept [deptId=" + deptId + ", deptName=" + deptName + ", deptVersion=" + deptVersion + "]"; } }DeptDao.java
package com.rk.dao; import org.hibernate.Session; import org.hibernate.SessionFactory; import com.rk.entity.Dept; public class DeptDao { private SessionFactory sf; public void setSf(SessionFactory sf) { this.sf = sf; } public Dept findById(int id) { Session session = sf.getCurrentSession(); Dept dept = (Dept) session.get(Dept.class, id); return dept; } public void save(Dept dept) { Session session = sf.getCurrentSession(); session.save(dept); } }DeptService.java
package com.rk.service; import com.rk.dao.DeptDao; import com.rk.entity.Dept; public class DeptService { private DeptDao deptDao; public void setDeptDao(DeptDao deptDao) { this.deptDao = deptDao; } public Dept findById(int id) { return deptDao.findById(id); } public void save(Dept dept) { deptDao.save(dept); // int i = 1/0; Dept newDept = new Dept(); newDept.setDeptName("HAHA_LLO"); deptDao.save(newDept); } }App.java
package com.rk.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.rk.entity.Dept; import com.rk.service.DeptService; public class App { @Test public void test() { ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); DeptService deptService = (DeptService) ac.getBean("deptService"); Dept dept = deptService.findById(3); System.out.println(dept); Dept newDept = (Dept) ac.getBean("dept"); newDept.setDeptName("HelloWorld"); deptService.save(newDept); } }
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流