在以前,我们在Java源代码中使用特殊的JavaDOC标签定义ORMapping规则,然后使用xDoclet生成映射规则文件(.hbm.xml)文件。现在有了Hibernate Annotation,连映射规则文件也不需要了,使用更加方便了。这里说说使用Hibernate Annotation时需要注意的一些地方。这些内容分散在Hiernate Annotation Reference文档和example中,与spring相关的部分则出现在Spring的文档中,这里把它们整理在一起。对我自己来说是起到备网的作用,对于其它Hibernate Annotation的用户,系统也能起到帮助查询的作用。
1. AnnotationConfiguration及配置映射规则。
在没有使用Hibnerate Annotation的使用,我们一般是使用org.hibernate.cfg.Configuration来配置和生成SessionFactory,使用Hibernate Annotation以后,要使用org.hibernate.cfg.AnnotationConfiguration类。该类在hibernate-annotation.jar,而不是hibernate3.jar中。
如果使用Spring + Hibernate的架构,要在Spring的配置文件里配置LocalSessionFactoryBean的时候,要记得定义property configurationClass。对于使用Annotation定义映射规则的类,在hibernate.cfg.xml文件中不能使用<mapping resource="..." />的形式,而要使用<mapping class="..." />的形式。LocalSessionFactoryBean的mappingResources不能调用AnnotationConfiguration的addClass和addPackage方法,因此使用Annotation定义映射规则的类,仍然要通过hibernate.cfg.xml文件来使AnnotationCongiguration载入它们的映射规则。使用Spring + Hibernate + Hibernate Annotation的情况下,LocalSessionFactoryBean的定义一般应该是:
<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
autowire="no" >
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="dataSource" ref="myDataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
2. <mapping package="..." /> 与<mapping class="..." />
前一种形式只是载入制定包中package-info.java文件中定义的Annotation,而该包下的所有持久化类仍然需要通过后一种形式逐一载入它们的映射规则。
3. 使用sequence生成id
使用sequence生成id时,id属性的Annotation应该是:
@Id
@GeneratedValue (strategy=GenerationType.SEQUENCE, generator="SEQ_BOOK_ID")
需要注意的是,GeneratedValue中的generator不是sequence的名字,而是一个另外定义的SequenceGenerator的名字。这个SequenceGenerator应该定义在类的级别,因此比较完整的代码是想这个样子的:
@Entity
@AccessType("property")
@Table(name="BOOK")
@SequenceGenerator (name="SEQ_BOOK_ID", sequenceName="SEQ_BOOK_ID")
public class Book {
private Long id;
@Id
@GeneratedValue (strategy=GenerationType.SEQUENCE, generator="SEQ_BOOK_ID")
public Long getId() {
return id;
}
......
}
成功配置:
@SequenceGenerator(name="generator",sequenceName = "SEQ_SYSMGR_LOGIN_LOG")@Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="generator")
4. AccessType
如果要Hibnerate使用get/set方法存取属性的话,一定要在类级别加上:
@AccessType("property")
5. NamedNativeQuery
使用NamedNativeQuery定义native SQL query的时候,即使只返回一个字段,也需要定义SqlResultSetMapping,见下面的例子:
@SqlResultSetMapping(name="keyWords", columns=@ColumnResult (name="key_word"))
@NamedNativeQuery (name="listKeyWords",
query="select distinct key_word from key_words order by key_word",
resultSetMapping="keyWords")
分享到:
相关推荐
Struts+Spring+Hibernate实现上传下载 本文将围绕SSH文件上传下载的主题,向您详细讲述如何开发基于SSH的Web程序。SSH各框架的均为当前最新版本: •Struts 1.2 •Spring 1.2.5 •Hibernate 3.0 ...
总结一下,SSH整合中的Hibernate配置涉及到Spring事务管理器的设置,包括创建SessionFactory,配置HibernateTransactionManager,以及选择合适的事务管理策略。正确配置后,开发者可以充分利用Spring和Hibernate的...
在IT行业中,Spring框架以其强大的依赖注入和AOP(面向切面编程)能力而闻名,尤其是在企业级应用开发中。本案例重点探讨了Spring如何与两种流行的数据访问技术——JDBC(Java Database Connectivity)和Hibernate...
这里配置了一个`HibernateTransactionManager`实例,通过`sessionFactory`属性关联了一个Hibernate的`SessionFactory`。 ##### DAO层的事务代理配置 ```xml <!-- DAO层接口实现 --> class=...
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> ``` 3. **基于AspectJ的事务管理** 这种方式利用AspectJ的AOP代理,可以在编译时或运行时将...
与`SessionFactory`的配置一样,这个Bean的类路径也需更新,从`org.springframework.orm.hibernate.HibernateTransactionManager`更改为`org.springframework.orm.hibernate3.HibernateTransactionManager`,以利用...
HibernateTransactionManager transactionManager = new HibernateTransactionManager(); transactionManager.setSessionFactory(sessionFactory); return transactionManager; } @Bean(name = ...
这是因为`HibernateTransactionManager`是专门为Hibernate设计的,它可以理解Hibernate的Session,而`DataSourceTransactionManager`虽然适用于JDBC操作,但无法处理Hibernate特有的事务边界。`...
在Spring中,我们可以创建一个`PlatformTransactionManager`的实现,如`HibernateTransactionManager`,来管理Hibernate的事务。`HibernateTransactionManager`能够与Hibernate SessionFactory配合工作,自动处理...
- 解决方案:更新sessionFactory和transactionManager的bean定义,使用`LocalSessionFactoryBean`和`HibernateTransactionManager`,并引用正确的数据源。 - 错误2:`java.lang.NoSuchMethodError: org.hibernate...
在XML配置文件中,首先定义一个`HibernateTransactionManager`的bean,并将其与`SessionFactory`关联起来。具体配置如下: ```xml <bean id="transactionManager" class="org.springframework.orm.hibernate3....
在整合Hibernate Synchronizer与Spring框架的过程中,我们主要关注...通常,我们会配置一个事务管理器(例如`HibernateTransactionManager`),并将SessionFactory注入其中,以便在需要时进行事务控制。例如: ```xml ...
<bean id="transactionManagerContent" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <bean id="transactionManagerIndex" class="org.springframework.orm.hibernate5....
- `PlatformTransactionManager`:事务管理器接口,具体实现有`DataSourceTransactionManager`(适用于JDBC事务)和`HibernateTransactionManager`(适用于Hibernate事务)。 - `@Transactional`:用于标记事务...
在整合中,通常会使用HibernateTransactionManager,它是PlatformTransactionManager的一个实现,专门针对Hibernate的事务管理。 1. **配置Hibernate SessionFactory**:在Spring配置文件中,定义SessionFactory的...
例如,`TransactionProxyFactoryBean`被用来创建事务代理,通过设置`transactionManager`属性指向对应的事务管理器,如`HibernateTransactionManager`,并指定需要进行事务控制的业务方法。 ```xml *">...
SessionFactory是从Hibernate的配置文件中读取数据库连接信息并创建的,而HibernateTransactionManager则负责处理与Hibernate相关的事务。 ```xml <!-- 配置Hibernate属性 --> <!-- 配置其他Hibernate属性...
在Spring_Hibernate框架中,我们可以使用HibernateTransactionManager来管理事务。如下所示: ```xml <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> ...
在实际开发中,我们可能会创建一个User实体类,然后在Spring配置文件中声明对应的SessionFactoryBean和HibernateTransactionManager。在服务层,通过@Autowired注解注入SessionFactory,然后创建Session,进行CRUD...