对于采用hibernate方式实现数据持久化映射的方式,过去,Hibernate 依靠外部的XML文件来配置持久化对象,数据库映射文件定义在一组XML映射文件里并且在程序开始的时候被装载。最近的Hibernate版本里,一个新的建立在Java 5 注解之上更为优雅的方法出现了.利用新的Hibernate Annonations 库,你可以发布一次如你以前的映射文件所定义的信息。
为 了使用Hibernate Annotations,你需要最新的Hibernate 3.2 ,当然还有Java 5 你可以在Hibernate web site 这个网站下载Hibernate 3.2和Hibernate Annotations库.除了标准的Hibernate 库文件和必须的依赖库之外,还需要下载 Hibernate Annotations库和Java 持久化API ---ejb3-persstence.jar文件。
在hibernate配置文件中声明采用Hibernate Annotations方式配置的hibernate sessionFactory,具体配置如下:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"/>
<property name="configLocations">
<list>
<value>classpath*:conf/hibernate.cfg.xml</value>
<!-- 在此声明配置文件里声明持久化类,如hibernate.cfg.xml文件内容如下
<hibernate-configuration>
<session-factory>
<mapping class="com.zhjy.gea.module.assessment.appraisal.domain.Appraisal" />
<!-- 声明的持久化类-->
</session-factory>
</hibernate-configuration>
-->
</list>
</property>
<property name="mappingDirectoryLocations">
<list>
×××××××
</list>
</property>
<property name="lobHandler" ref="lobHandler" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">false</prop>
<prop key="hibernate.max_fetch_depth">2</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">50</prop>
<prop key="hibernate.use_outer_join">true</prop>
</props>
<!-- props>
<prop key="hibernate.dialect">org.hibernate.dialect.OscarDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
</props -->
</property>
</bean>
在此声明了一个基于Annotations 的Hibernate Session Factory。
如果你集成spring,你也可以采用
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.DerbyDialect</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
...
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.onjava.modelplanes.domain.PlaneType</value>
<value>com.onjava.modelplanes.domain.ModelPlane</value>
...
</list>
</property>
</bean>
方式来声明sessionFactory类。
映射关系:Onetomany
实体类对应表名的注解
例:
@SuppressWarnings("serial")
@Entity
@Table(name = "GEA_APPRAISAL")//这里对应数据库中的表名
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)//采用缓存设置
public class Appraisal extends BaseAssessment {
@OneToMany(mappedBy="appraisal",cascade ={CascadeType.ALL},fetch=FetchType.LAZY)//mappedBy="appraisal"
//这个appraisal对应的是many一端即Buy实体类里面的one属性,即AppraisalEvent中定义的ManyToOne中One对应的//实体类.
@OrderBy("ranking")//many方按ranking排序
//@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
private List<AppraisalEvent> appraisalEvents = new ArrayList<AppraisalEvent>();
对应的Many方的配置ManyToOne
@SuppressWarnings("serial")
@Entity
@Table(name = "GEA_APPRAISALEVENT")
public class AppraisalEvent extends BaseAssessment {
@ManyToOne(cascade ={CascadeType.PERSIST,CascadeType.MERGE})
@JoinColumn(name = "Id") //这个Id是one一边对应数据库中的主键名
/** 对应的One方的实体类 */
private Appraisal appraisal;
在many方的表中自动生成appraisal_id字段与One所指的实体类映射的表的主键关联,实际的数据库表关联语句为
alter table GEA_APPRAISALEVENT
add constraint FKCC003B712ABC052 foreign key (APPRAISAL_ID)
references GEA_APPRAISAL (ID);