最近整合Spring3 和Hibernate 4的总结
来源:互联网 发布:人工智能技术排名第一 编辑:程序博客网 时间:2024/06/01 07:43
最近写毕设的实验,就顺便把hibernate和spring配了一下,记录下来以后可能有用的到
Hibernate 配置
Hibernate.cfg.xml文件在intellij中配置数据源之后生成
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <property name="connection.url">jdbc:mysql://localhost:3306/weibo_test</property> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.username">root</property> <property name="connection.password">62050218</property> <!-- Hibernate setting --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.autocommit">true</property> <property name="javax.persistence.validation.mode">none</property> <!-- c3p0 setting --> <property name="hibernate.connection.provider_class"> org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider </property> <property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property> <mapping class="org.mt.persistence.entity.CourseEntity"/> <mapping class="org.mt.persistence.entity.StudentEntity"/> <mapping class="org.mt.persistence.entity.StudentHasCourseEntity"/> <!-- DB schema will be updated if needed --> <!-- <property name="hbm2ddl.auto">update</property> --> </session-factory></hibernate-configuration>其中第一部分是数据源配置,第二部分是hibernate方言和自动提交等的配置,第三部分是c3P0数据源连接池的配置,之前本来是没有配这部分的,但是后来发现如果不在spring中直接配置数据源,而是继续使用hibernate配置文件的话,必须使用连接池才可以。c3p0配置下面的一部分是数据库实体配置,先通过mysql workbench 画ER图生成sql,再通过数据库逆向生成实体类还是比较方便的。
Spring 配置
spring-config.xml文件通过intellij自动生成
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:component-scan base-package="org.mt.persistence.dao"/> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="configLocation" value="classpath:hibernate.cfg.xml" /> </bean> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="transactionManager"/></beans>
配置文件中sessionFactory通过配置文件引用hibernate的配置,componet-scan 配置了@Repository注解会扫描的包,使用了这个注解的bean不用在xml中配置就会自动被扫描为bean,bean id就是类名首字母小写。最后两段配置了spring中的transactionManager用于管理Hibernate事务,不然@Transactional注解无法用
@Repositorypublic class StudentDaoImp implements StudentDao{ private SessionFactory sessionFactory; @Autowired public StudentDaoImp(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } private Session getCurrentSession() { return sessionFactory.getCurrentSession(); } @Transactional @Override public void addStudent(StudentEntity student) { getCurrentSession().save(student); } @Transactional @Override public StudentEntity loadStudent(Integer studentID) { return (StudentEntity) getCurrentSession().get(StudentEntity.class, studentID); } @Transactional @Override public void updateStudent(StudentEntity student) { getCurrentSession().update(student); }}
一个简单的利用@Repository 和@Transactional注解例子,通过这种方法定义bean必须定义接口,然后通过接口来调用spring 中的bean,这个倒是和spring一直崇尚的面向接口编程比较接近。@Autowired 是spring中的自动装配,@Transactional 在方法调用的时候都伴随着一个事务的开始与结束,结合hibernate3之后提供的线程绑定的currentSession,可以取代以前所用的HibernateTemplate。关于这几种注解的详细用法后面应该还是会花时间专门研究一下。
在整个实验的过程中,通过数据库反向生成实体的时候。多对多的关系生成的实体在实验过程中总是会报重复列的错误。
@javax.persistence.IdClass(org.mt.persistence.entity.StudentHasCourseEntityPK.class)@javax.persistence.Table(name = "student_has_course", schema = "", catalog = "weibo_test")@Entitypublic class StudentHasCourseEntity { private int studentId; private int courseId; private StudentEntity studentByStudentId; private CourseEntity courseByCourseId; @javax.persistence.Column(name = "student_id", nullable = false, insertable = true, updatable = true, length = 10, precision = 0) @Id public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } @javax.persistence.Column(name = "course_id", nullable = false, insertable = true, updatable = true, length = 10, precision = 0) @Id public int getCourseId() { return courseId; } public void setCourseId(int courseId) { this.courseId = courseId; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; StudentHasCourseEntity that = (StudentHasCourseEntity) o; if (courseId != that.courseId) return false; if (studentId != that.studentId) return false; return true; } @Override public int hashCode() { int result = studentId; result = 31 * result + courseId; return result; } @ManyToOne @javax.persistence.JoinColumn(name = "student_id", referencedColumnName = "id", nullable = false,insertable = false,updatable = false) public StudentEntity getStudentByStudentId() { return studentByStudentId; } public void setStudentByStudentId(StudentEntity studentByStudentId) { this.studentByStudentId = studentByStudentId; } @ManyToOne @javax.persistence.JoinColumn(name = "course_id", referencedColumnName = "id", nullable = false,insertable = false,updatable = false) public CourseEntity getCourseByCourseId() { return courseByCourseId; } public void setCourseByCourseId(CourseEntity courseByCourseId) { this.courseByCourseId = courseByCourseId; }}
看代码可以发现,多对多关系在数据库中被解析为两个一对多关系,并有一张额外的关系表,表中的两个元素为多对多关系表的ID,两个外键一起作为主键。通过自动生成的话,外键和主键定义重复确实会发生冲突。因此在外键定义中加上
insertable = false,updatable = false可以保证插入的时候忽略外键,这里还是有点不清楚,后面还是应该再专门研究一下hibernate的实体配置
最后把项目maven的pom也贴上,免得以后配spring+hibernate的时候又忘了
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.mt</groupId> <artifactId>testUser</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <org.springframework.version>3.2.4.RELEASE</org.springframework.version> <version.hibernate>4.1.8.Final</version.hibernate> <version.hibernate-validator>4.3.1.Final</version.hibernate-validator> </properties> <dependencies> <!-- junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.24</version> </dependency> <!-- spring 配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Expression Language (depends on spring-core) Define this if you use Spring Expression APIs (org.springframework.expression.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Bean Factory and JavaBeans utilities (depends on spring-core) Define this if you use Spring Bean APIs (org.springframework.beans.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Aspect Oriented Programming (AOP) Framework (depends on spring-core, spring-beans) Define this if you use Spring AOP APIs (org.springframework.aop.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Application Context (depends on spring-core, spring-expression, spring-aop, spring-beans) This is the central artifact for Spring's Dependency Injection Container and is generally always defined --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Various Application Context utilities, including EhCache, JavaMail, Quartz, and Freemarker integration Define this if you need any of these integrations --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Transaction Management Abstraction (depends on spring-core, spring-beans, spring-aop, spring-context) Define this if you use Spring Transactions or DAO Exception Hierarchy (org.springframework.transaction.*/org.springframework.dao.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- JDBC Data Access Library (depends on spring-core, spring-beans, spring-context, spring-tx) Define this if you use Spring's JdbcTemplate API (org.springframework.jdbc.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Object-to-Relation-Mapping (ORM) integration with Hibernate, JPA, and iBatis. (depends on spring-core, spring-beans, spring-context, spring-tx) Define this if you need ORM (org.springframework.orm.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Object-to-XML Mapping (OXM) abstraction and integration with JAXB, JiBX, Castor, XStream, and XML Beans. (depends on spring-core, spring-beans, spring-context) Define this if you need OXM (org.springframework.oxm.*) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-oxm</artifactId> <version>${org.springframework.version}</version> </dependency> <!-- Support for testing Spring applications with tools such as JUnit and TestNG This artifact is generally always defined with a 'test' scope for the integration testing framework and unit testing stubs --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework.version}</version> <scope>test</scope> </dependency> <!-- Hibernate 配置 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${version.hibernate}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>${version.hibernate-validator}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator-annotation-processor</artifactId> <version>${version.hibernate-validator}</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>${version.hibernate}</version> </dependency> </dependencies></project>
另外,spring和hibernate的配置文件在使用maven来构建项目时应该放在maven的resource文件夹下
- 最近整合Spring3 和Hibernate 4的总结
- Spring3.0MVC和Hibernate基于annotation注解的整合
- Spring3.0MVC和Hibernate基于annotation注解的整合
- 总结一下最近整合spring4和hibernate4遇到的问题
- Spring3与Hibernate4整合,Spring中配置Hibernate基于XML和annotation的sessionFactory方式。
- MyBatis3.1.1和spring3.0的整合
- Spring3和Hibernate4整合的错误
- MyBatis3.x和Spring3.x的整合
- hibernate和spring整合总结
- Spring 和 Hibernate整合总结
- Flex4 + BlazeDS + Spring3 + hibernate 整合
- 工作流Activiti的学习总结(十一)Activiti5.6和Spring3.03整合
- spring3 和ehcache 整合
- Spring3+Hibernate+Struts2整合之注解整合
- spring3.2+ Hibernate 3.5.4-Final+struts2 整合开发Annotation
- spring3.2 + springMVC +hibernate 4 + mysql 5 整合框架
- 关于Struts2,hibernate的最近总结
- Spring3整合Hibernate 项目,Dao测试(新)
- Q4M使用手册
- Hadoop管理员的十个最佳实践
- IE10&11安装失败出现9C59代码之解决方案,
- topcoder SRM598 div1
- c#、winfrom 给程序添加命令行参数
- 最近整合Spring3 和Hibernate 4的总结
- 简单生成遮罩层的代码示例
- 割点模板
- varnish配置实战
- hdu 4127 Flood-it! 搜索
- VS 2010把行数显示出来
- mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法(上)
- pe 文件
- 李嘉诚预言新操作系统即将面世 三星平台梦隐现