<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>绿色记忆 &#187; Hibernate</title>
	<atom:link href="https://blog.gmem.cc/tag/hibernate/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.gmem.cc</link>
	<description></description>
	<lastBuildDate>Fri, 17 Apr 2026 09:20:32 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.14</generator>
	<item>
		<title>Spring配置：集成Hibernate、JacksonJSON、AspectJ等框架</title>
		<link>https://blog.gmem.cc/spring-config-with-hibernate-jacksonjson-aspectj</link>
		<comments>https://blog.gmem.cc/spring-config-with-hibernate-jacksonjson-aspectj#comments</comments>
		<pubDate>Mon, 26 Nov 2012 08:39:24 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[AspectJ]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JacksonJSON]]></category>
		<category><![CDATA[Log4jdbc]]></category>
		<category><![CDATA[Scheduler]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[配置文件]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1110</guid>
		<description><![CDATA[<p>本文提及的该套配置文件，覆盖了JavaEE项目开发的最常见需求，包括：依赖注入、事务控制、AOP、任务调度、缓存、MVC框架等方面的内容。 容易改变的配置项独立到属性文件中： [crayon-69e2001644e11708103327/] Spring配置文件部分： [crayon-69e2001644e18206161978/] Spring MVC配置文件部分： [crayon-69e2001644e1e985152289/] ehcache配置部分： [crayon-69e2001644e21952265434/] Web.xml配置（使用了Spring的JavaConfig）： [crayon-69e2001644e23735187465/] Java Config类： [crayon-69e2001644e26495967971/] [crayon-69e2001644e28720293876/] Maven依赖包列表： [crayon-69e2001644e2a390435061/] Maven插件配置（支持AspectJ）： [crayon-69e2001644e2e263757650/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/spring-config-with-hibernate-jacksonjson-aspectj">Spring配置：集成Hibernate、JacksonJSON、AspectJ等框架</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both">本文提及的该套配置文件，覆盖了JavaEE项目开发的最常见需求，包括：依赖注入、事务控制、AOP、任务调度、缓存、MVC框架等方面的内容。<br />
容易改变的配置项独立到属性文件中：<br />
<pre class="crayon-plain-tag">hibernateDialect=org.hibernate.dialect.MySQL5Dialect
#启用了log4jdbc支持
jdbcDriver=net.sf.log4jdbc.DriverSpy
jdbcDriverUrl=jdbc:log4jdbc:mysql://192.168.0.201:3306/initpemsdb1.1.1
jdbcUserName=root
jdbcPassword=root</pre><br />
Spring配置文件部分：<br />
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:util="http://www.springframework.org/schema/util" 
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:task="http://www.springframework.org/schema/task" 
    xmlns:cache="http://www.springframework.org/schema/cache"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/task  http://www.springframework.org/schema/task/spring-task-3.0.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
    "&gt;
    &lt;!-- 定义属性，在后面的配置中可以使用#{appCfg.xxx}引用 --&gt;
    &lt;util:properties id="appCfg" location="classpath:applicationConfig.properties" /&gt;
    &lt;!-- 包扫描配置 --&gt;
    &lt;context:component-scan base-package="cc.gmem.demo"&gt;
        &lt;!-- 去除Java Config类 --&gt;
        &lt;context:exclude-filter type="annotation" expression="org.springframework.context.annotation.Configuration" /&gt;
        &lt;!-- 去除Spring MVC类 --&gt;
        &lt;context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /&gt;
        &lt;!-- 匹配AspectJ Pattern的类被去除 --&gt;
        &lt;context:exclude-filter type="aspectj" expression="cc.gmem.demo.aop.web.*" /&gt;
    &lt;/context:component-scan&gt;
    &lt;!-- 启用注解支持 --&gt;
    &lt;context:annotation-config /&gt;
    &lt;!-- 支持@Configurable注解 --&gt;
    &lt;context:spring-configured /&gt;
    &lt;!--  启用注解方式的事务：基于AspectJ织入 --&gt;
    &lt;tx:annotation-driven transaction-manager="txManager" mode="aspectj" /&gt;
    &lt;!--  启用注解方式的缓存配置：基于AspectJ织入 --&gt;
    &lt;cache:annotation-driven cache-manager="cacheManager" mode="aspectj" /&gt;
    &lt;!--  启用注解方式的任务执行(例如@Async)：基于AspectJ织入 --&gt;
    &lt;task:annotation-driven executor="taskExecutor" mode="aspectj" /&gt;
    
    &lt;!--  任务调度器配置，pool-size为线程池大小，限制了同时最多被调度的任务 --&gt;
    &lt;task:scheduler pool-size="100" id="scheduler" /&gt;
    &lt;!-- 任务计划列表，支持固定频率、固定延迟、Cron表达式等 --&gt;
    &lt;task:scheduled-tasks scheduler="scheduler"&gt;
        &lt;task:scheduled fixed-rate="120000" method="run" ref="hibernateStatisticsMonitor" /&gt;
    &lt;/task:scheduled-tasks&gt;
    &lt;!-- 任务执行器，用于异步执行任务 --&gt;
    &lt;task:executor id="taskExecutor" keep-alive="3600" pool-size="10-100" queue-capacity="10000" rejection-policy="CALLER_RUNS" /&gt;
    &lt;!-- 引入其它Spring配置文件 --&gt;
    &lt;import resource="report-and-etl.xml" /&gt;  
    &lt;!-- Hibernate配置  --&gt;
    &lt;bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"&gt;
        &lt;property name="alias" value="connectionPool" /&gt;
        &lt;property name="driver" value="#{appCfg.jdbcDriver}" /&gt;
        &lt;property name="driverUrl" value="#{appCfg.jdbcDriverUrl}" /&gt;
        &lt;property name="user" value="#{appCfg.jdbcUserName}" /&gt;
        &lt;property name="password" value="#{appCfg.jdbcPassword}" /&gt;
        &lt;property name="statistics" value="10s" /&gt;
        &lt;property name="minimumConnectionCount" value="10" /&gt;
        &lt;property name="maximumConnectionCount" value="100" /&gt;
        &lt;property name="simultaneousBuildThrottle" value="10" /&gt;
        &lt;property name="maximumActiveTime" value="3600000" /&gt;
    &lt;/bean&gt;
    &lt;bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" autowire="byName" /&gt;
    &lt;bean id="nativeJdbcExtractor" class="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor" lazy-init="true" /&gt;
    &lt;bean id="sessionFactory" p:dataSource-ref="dataSource" class="cc.gmem.demo.hibernate.AnnotationSessionFactoryBean" depends-on="appCfg" &gt;
        &lt;property name="packagesToScan"&gt;
            &lt;list&gt;
                &lt;value&gt;cc.gmem.demo.**.domain&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
        &lt;property name="hibernateProperties"&gt;
            &lt;value&gt;
                hibernate.dialect=#{appCfg.hibernateDialect}
                hibernate.jdbc.batch_size=30
                hibernate.show_sql=false
                hibernate.format_sql=true
                hibernate.generate_statistics=true
                hibernate.transaction.factory_class=org.hibernate.transaction.JDBCTransactionFactory
                hibernate.current_session_context_class=org.springframework.orm.hibernate3.SpringSessionContext
                hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory
                hibernate.hbm2ddl.auto=update
                #启用二级缓存
                hibernate.cache.use_second_level_cache=true
                hibernate.cache.use_query_cache=true
                hibernate.cache.region.factory_class=org.hibernate.cache.SingletonEhCacheRegionFactory
            &lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
    &lt;!-- Spring缓存配置 --&gt;
    &lt;bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"&gt;
        &lt;property name="cacheManager" ref="ehcache" /&gt;
    &lt;/bean&gt;
    &lt;bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"&gt;
        &lt;property name="configLocation"&gt;
            &lt;value&gt;classpath:ehcache.xml&lt;/value&gt;
        &lt;/property&gt;
        &lt;property name="shared" value="true" /&gt;
    &lt;/bean&gt;
    &lt;bean id="hibernateStatisticsMonitor" class="cc.gmem.demo.hibernate.HibernateStatisticsMonitor" /&gt;
    &lt;bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" /&gt;
    &lt;!-- Velocity引擎配置 --&gt;
    &lt;bean id="velocityEngine" class="org.apache.velocity.app.VelocityEngine"&gt;
        &lt;constructor-arg type="java.util.Properties"&gt;
            &lt;value&gt;
                &lt;![CDATA[
                #{T(org.apache.velocity.runtime.RuntimeConstants).RUNTIME_LOG_LOGSYSTEM_CLASS}=org.apache.velocity.runtime.log.Log4JLogChute
                runtime.log.logsystem.log4j.logger=velocityLogger
                #{T(org.apache.velocity.runtime.RuntimeConstants).INPUT_ENCODING}=UTF-8
                #{T(org.apache.velocity.runtime.RuntimeConstants).OUTPUT_ENCODING}=UTF-8
                #{T(org.apache.velocity.runtime.RuntimeConstants).VM_PERM_ALLOW_INLINE}=true
                #{T(org.apache.velocity.runtime.RuntimeConstants).RESOURCE_LOADER}=class
                #{T(org.apache.velocity.runtime.RuntimeConstants).PARSER_POOL_SIZE}=100
                class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
                ]]&gt;
            &lt;/value&gt;
        &lt;/constructor-arg&gt;
    &lt;/bean&gt;
    &lt;!--国际化支持--&gt;
    &lt;bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"&gt;
         &lt;property name="basenames"&gt;
             &lt;list&gt;
                 &lt;value&gt;classpath:message.gmemdemo&lt;/value&gt;
             &lt;/list&gt;
         &lt;/property&gt;
         &lt;property name="defaultEncoding" value="UTF-8" /&gt;
         &lt;property name="cacheSeconds" value="5" /&gt;
    &lt;/bean&gt;
    &lt;!--Jackson JSON --&gt;
    &lt;bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" autowire="byType" /&gt;
    &lt;!-- Spring类型转换服务，特别是用于时间日期格式转换 --&gt;
    &lt;bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"&gt;
        &lt;property name="converters"&gt;
            &lt;set&gt;
                &lt;bean class="net.greenmemory.spring.converter.DateTimeConvertor"&gt;
                    &lt;constructor-arg&gt;
                        &lt;array&gt;
                            &lt;value&gt;yyyy-MM-dd&lt;/value&gt;
                            &lt;value&gt;yyyy-MM-dd HH:mm:ss&lt;/value&gt;
                            &lt;value&gt;yyyy-MM-dd HH:mm:ss.SSS&lt;/value&gt;
                       &lt;/array&gt;
                    &lt;/constructor-arg&gt;
                &lt;/bean&gt;
            &lt;/set&gt;
       &lt;/property&gt;
       &lt;property name="formatters"&gt;
           &lt;set&gt;
               &lt;bean class="org.springframework.format.datetime.DateFormatter"&gt;
                   &lt;constructor-arg&gt;
                       &lt;value&gt;yyyy-MM-dd&lt;/value&gt;
                   &lt;/constructor-arg&gt;
               &lt;/bean&gt;
           &lt;/set&gt;
       &lt;/property&gt;
       &lt;property name="formatterRegistrars"&gt;
           &lt;set&gt;
           &lt;/set&gt;
       &lt;/property&gt;
    &lt;/bean&gt;
&lt;/beans&gt;</pre><br />
Spring MVC配置文件部分：<br />
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    "&gt;
    &lt;context:component-scan base-package="cc.gmem.demo.**.ctrl"&gt;
        &lt;context:exclude-filter type="annotation" expression="org.springframework.context.annotation.Configuration" /&gt;
    &lt;/context:component-scan&gt;
    &lt;context:component-scan base-package="cc.gmem.demo.aop.web" /&gt;

    &lt;context:annotation-config /&gt;

    &lt;mvc:annotation-driven&gt;
        &lt;mvc:message-converters&gt;
            &lt;bean class="org.springframework.http.converter.json.jacksonjson.MappingJackson2HttpMessageConverter"&gt;
                &lt;property name="objectMapper" ref="objectMapper" /&gt;
            &lt;/bean&gt;
        &lt;/mvc:message-converters&gt;
    &lt;/mvc:annotation-driven&gt;

    &lt;mvc:interceptors&gt;
        &lt;bean id="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"&gt;
            &lt;property name="sessionFactory" ref="sessionFactory" /&gt;
        &lt;/bean&gt;
            &lt;mvc:interceptor&gt;     
            &lt;mvc:mapping path="/home/*" /&gt; 
            &lt;!-- 自定义MVC拦截器 --&gt;
            &lt;bean class="cc.gmem.demo.spring.LogonInterceptor" /&gt; 
        &lt;/mvc:interceptor&gt;  
        
    &lt;/mvc:interceptors&gt;

    &lt;bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"&gt;
        &lt;property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /&gt;
        &lt;property name="prefix" value="/WEB-INF/jsp/" /&gt;
        &lt;property name="suffix" value=".jsp" /&gt;
        &lt;property name="order" value="0" /&gt;
    &lt;/bean&gt;

    &lt;mvc:resources mapping="/css/**" location="/css/" /&gt;
    &lt;mvc:resources mapping="/icons/**" location="/icons/" /&gt;
    &lt;mvc:resources mapping="/images/**" location="/images/" /&gt;
    &lt;mvc:resources mapping="/themes/**" location="/themes/" /&gt;
    &lt;mvc:resources mapping="/js/**" location="/js/" /&gt;
&lt;/beans&gt;</pre><br />
ehcache配置部分：<br />
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;ehcache&gt;
    &lt;diskStore path="D:/Temp/ehcache" /&gt;
    &lt;defaultCache eternal="false" /&gt;
    &lt;cache name="entityCache" eternal="false" maxElementsInMemory="1000" timeToIdleSeconds="120" timeToLiveSeconds="3600"
        overflowToDisk="true" memoryStoreEvictionPolicy="LFU" /&gt;
&lt;/ehcache&gt;</pre><br />
Web.xml配置（使用了Spring的JavaConfig）：<br />
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;contextClass&lt;/param-name&gt;
        &lt;param-value&gt;org.springframework.web.context.support.AnnotationConfigWebApplicationContext&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;context-param&gt;
        &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
        &lt;param-value&gt;cc.gmem.demo.spring.SpringBeanDefinitionRegistrar&lt;/param-value&gt;
    &lt;/context-param&gt;
    &lt;listener&gt;
        &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
    &lt;/listener&gt;
    &lt;servlet&gt;
        &lt;servlet-name&gt;springmvc&lt;/servlet-name&gt;
        &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;contextClass&lt;/param-name&gt;
            &lt;param-value&gt;org.springframework.web.context.support.AnnotationConfigWebApplicationContext&lt;/param-value&gt;
        &lt;/init-param&gt;
        &lt;init-param&gt;
            &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
            &lt;param-value&gt;cc.gmem.demo.spring.SpringMVCBeanDefinitionRegistrar&lt;/param-value&gt;
        &lt;/init-param&gt;
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;springmvc&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;

    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;adminServlet&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/proxool&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;

    &lt;session-config&gt;
        &lt;session-timeout&gt;60&lt;/session-timeout&gt;
    &lt;/session-config&gt;

    &lt;error-page&gt;
        &lt;error-code&gt;404&lt;/error-code&gt;
        &lt;location&gt;/WEB-INF/jsp/error-404.jsp&lt;/location&gt;
    &lt;/error-page&gt;
    &lt;error-page&gt;
        &lt;error-code&gt;401&lt;/error-code&gt;
        &lt;location&gt;/WEB-INF/jsp/error-401.jsp&lt;/location&gt;
    &lt;/error-page&gt;
    &lt;error-page&gt;
        &lt;error-code&gt;500&lt;/error-code&gt;
        &lt;location&gt;/WEB-INF/jsp/error-500.jsp&lt;/location&gt;
    &lt;/error-page&gt;
     &lt;welcome-file-list&gt;
        &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
    &lt;/welcome-file-list&gt;
&lt;/web-app&gt;</pre><br />
Java Config类：<br />
<pre class="crayon-plain-tag">@Configuration
/* XML-based bean definitions */
@ImportResource ( "classpath:applicationContext.xml" )
public class SpringBeanDefinitionRegistrar
{

    /* Auto injected spring context */
    @SuppressWarnings ( "unused" )
    @Inject
    private ApplicationContext applicationContext;

    /* Programmatic bean definition */
    @Bean ( name = "helper" )
    public Helper helper()
    {
        Helper helper = new Helper();
        return helper;
    }

}</pre><br />
<pre class="crayon-plain-tag">@Configuration
@ImportResource ( "classpath:spring-mvc.xml" )
public class SpringMVCBeanDefinitionRegistrar
{

}</pre><br />
Maven依赖包列表：<br />
<pre class="crayon-plain-tag">&lt;properties&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;spring.version&gt;3.1.2.RELEASE&lt;/spring.version&gt;
    &lt;hibernate.version&gt;3.6.10.Mod&lt;/hibernate.version&gt;
    &lt;aspectj.version&gt;1.6.11&lt;/aspectj.version&gt;
    &lt;jackson.version&gt;2.0.4&lt;/jackson.version&gt;
&lt;/properties&gt;
&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-core&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-jdbc&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-beans&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-webmvc&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-orm&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
        &lt;artifactId&gt;spring-test&lt;/artifactId&gt;
        &lt;version&gt;${spring.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.hibernate&lt;/groupId&gt;
        &lt;artifactId&gt;hibernate-core&lt;/artifactId&gt;
        &lt;version&gt;${hibernate.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
        &lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;
        &lt;version&gt;${aspectj.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.aspectj&lt;/groupId&gt;
        &lt;artifactId&gt;aspectjrt&lt;/artifactId&gt;
        &lt;version&gt;${aspectj.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
        &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
        &lt;version&gt;${jackson.version}&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
        &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
        &lt;version&gt;2.4&lt;/version&gt;
        &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet.jsp&lt;/groupId&gt;
        &lt;artifactId&gt;jsp-api&lt;/artifactId&gt;
        &lt;version&gt;2.0&lt;/version&gt;
        &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
        &lt;artifactId&gt;jstl&lt;/artifactId&gt;
        &lt;version&gt;1.2&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;taglibs&lt;/groupId&gt;
        &lt;artifactId&gt;standard&lt;/artifactId&gt;
        &lt;version&gt;1.1.2&lt;/version&gt;
        &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;javax.el&lt;/groupId&gt;
        &lt;artifactId&gt;el-api&lt;/artifactId&gt;
        &lt;version&gt;2.2&lt;/version&gt;
        &lt;scope&gt;provided&lt;/scope&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;proxool&lt;/groupId&gt;
        &lt;artifactId&gt;proxool&lt;/artifactId&gt;
        &lt;version&gt;0.9.1&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.javassist&lt;/groupId&gt;
        &lt;artifactId&gt;javassist&lt;/artifactId&gt;
        &lt;version&gt;3.15.0-GA&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;net.sf.log4jdbc&lt;/groupId&gt;
        &lt;artifactId&gt;log4jdbc3&lt;/artifactId&gt;
        &lt;version&gt;1.2-ext-3&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;com.sqlinform&lt;/groupId&gt;
        &lt;artifactId&gt;sqlinform&lt;/artifactId&gt;
        &lt;version&gt;0.0.1&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;javax.annotation&lt;/groupId&gt;
        &lt;artifactId&gt;jsr250-api&lt;/artifactId&gt;
        &lt;version&gt;1.0&lt;/version&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;javax.inject&lt;/groupId&gt;
        &lt;artifactId&gt;javax.inject&lt;/artifactId&gt;
        &lt;version&gt;1&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;joda-time&lt;/groupId&gt;
        &lt;artifactId&gt;joda-time&lt;/artifactId&gt;
        &lt;version&gt;2.1&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;cglib&lt;/groupId&gt;
        &lt;artifactId&gt;cglib&lt;/artifactId&gt;
        &lt;version&gt;2.2.2&lt;/version&gt;
    &lt;/dependency&gt;

    &lt;dependency&gt;
        &lt;groupId&gt;org.apache.poi&lt;/groupId&gt;
        &lt;artifactId&gt;poi&lt;/artifactId&gt;
        &lt;version&gt;3.9&lt;/version&gt;
    &lt;/dependency&gt;
    
    &lt;dependency&gt;
        &lt;groupId&gt;opensymphony&lt;/groupId&gt;
        &lt;artifactId&gt;quartz-all&lt;/artifactId&gt;
        &lt;version&gt;1.6.3&lt;/version&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</pre><br />
Maven插件配置（支持AspectJ）：<br />
<pre class="crayon-plain-tag">&lt;plugin&gt;
    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
    &lt;artifactId&gt;aspectj-maven-plugin&lt;/artifactId&gt;
    &lt;version&gt;1.4&lt;/version&gt;
    &lt;executions&gt;
        &lt;execution&gt;
            &lt;id&gt;compile&lt;/id&gt;
            &lt;configuration&gt;
                &lt;XnoInline&gt;true&lt;/XnoInline&gt;
                &lt;forceAjcCompile&gt;true&lt;/forceAjcCompile&gt;
                &lt;showWeaveInfo&gt;true&lt;/showWeaveInfo&gt;
                &lt;source&gt;1.5&lt;/source&gt;
                &lt;target&gt;1.5&lt;/target&gt;
                &lt;encoding&gt;UTF-8&lt;/encoding&gt;
                &lt;verbose&gt;true&lt;/verbose&gt;
                &lt;outxml&gt;true&lt;/outxml&gt;
                &lt;aspectLibraries&gt;
                    &lt;aspectLibrary&gt;
                        &lt;groupId&gt;org.springframework&lt;/groupId&gt;
                        &lt;artifactId&gt;spring-aspects&lt;/artifactId&gt;
                    &lt;/aspectLibrary&gt;
                &lt;/aspectLibraries&gt;
            &lt;/configuration&gt;
            &lt;goals&gt;
                &lt;goal&gt;compile&lt;/goal&gt;
            &lt;/goals&gt;
        &lt;/execution&gt;
    &lt;/executions&gt;
&lt;/plugin&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/spring-config-with-hibernate-jacksonjson-aspectj">Spring配置：集成Hibernate、JacksonJSON、AspectJ等框架</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/spring-config-with-hibernate-jacksonjson-aspectj/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于JavaConfig方式的Spring+Hibernate集成</title>
		<link>https://blog.gmem.cc/javaconfig-based-sh</link>
		<comments>https://blog.gmem.cc/javaconfig-based-sh#comments</comments>
		<pubDate>Mon, 05 Nov 2012 05:47:36 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1508</guid>
		<description><![CDATA[<p>JavaConfig类 包含Spring、Hibernate、事务管理等功能的样例 [crayon-69e2001645501380623545/] 初始化Spring ApplicationContext的代码 [crayon-69e2001645507926372672/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/javaconfig-based-sh">基于JavaConfig方式的Spring+Hibernate集成</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">JavaConfig类</span></div>
包含Spring、Hibernate、事务管理等功能的样例<br />
<pre class="crayon-plain-tag">package sparknet.wnet.saic.intf.spring;

import java.io.IOException;
import java.util.Properties;

import javax.inject.Inject;
import javax.sql.DataSource;

import net.greenmemory.breeze.persist.OracleProxoolDataSource;
import net.greenmemory.commons.db.QueryRunner;
import net.greenmemory.commons.lang.NumberUtils;
import net.greenmemory.spring.core.io.ClassPathResource;

import org.hibernate.SessionFactory;
import org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator;
import org.springframework.beans.factory.BeanInitializationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.FilterType;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.AnnotationTransactionAttributeSource;
import org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor;
import org.springframework.transaction.interceptor.TransactionInterceptor;

import cc.gmem.tools.hibernatetools.spring.Hibernate3LocalSessionFactoryBean;

@Configuration
@ComponentScan (
        basePackages = { "cc.gmem.saic", "cc.gmem.intf" },
        excludeFilters = { @Filter ( type = FilterType.ANNOTATION, value = Configuration.class ) } )
@EnableAspectJAutoProxy
public class BeanDefinitionRegistrar
{

    @Inject
    private ApplicationContext applicationContext;

    @Bean ( name = "cfg" )
    public Properties getAppConfig()
    {
        Properties props = new Properties();
        try
        {
            props.load( new ClassPathResource( "wsi.properties" ).getInputStream() );
        }
        catch ( IOException e )
        {
            throw new BeanInitializationException( e.getMessage(), e );
        }
        return props;
    }

    @Bean ( name = "dataSource" )
    public DataSource getDataSource()
    {
        OracleProxoolDataSource dataSource = new OracleProxoolDataSource();
        dataSource.setAlias( getAppConfig().getProperty( "jdbc.alias" ) );
        dataSource.setDriver( getAppConfig().getProperty( "jdbc.driverClass" ) );
        dataSource.setDriverUrl( getAppConfig().getProperty( "jdbc.url" ) );
        dataSource.setUser( getAppConfig().getProperty( "jdbc.user" ) );
        dataSource.setPassword( getAppConfig().getProperty( "jdbc.password" ) );
        dataSource.setMinimumConnectionCount( NumberUtils.toInt( getAppConfig().getProperty( "jdbc.minimumConnectionCount" ), 10 ) );
        dataSource.setMaximumConnectionCount( NumberUtils.toInt( getAppConfig().getProperty( "jdbc.maximumConnectionCount" ), 100 ) );
        dataSource.setSimultaneousBuildThrottle( NumberUtils.toInt( getAppConfig().getProperty( "jdbc.simultaneousBuildThrottle" ), 50 ) );
        dataSource.setMaximumActiveTime( NumberUtils.toInt( getAppConfig().getProperty( "jdbc.maximumActiveTime" ), 1200000 ) );
        dataSource.setEncrypted( false );
        dataSource.init();
        return dataSource;
    }

    @Bean ( name = "sessionFactory" )
    public SessionFactory getSessionFactory() throws Exception
    {
        Hibernate3LocalSessionFactoryBean bean = new Hibernate3LocalSessionFactoryBean();
        bean.setApplicationContext( applicationContext );
        bean.setDataSource( getDataSource() );
        bean.setMappingResources( new String[] { "wnetJhInterface.hbm.xml" } );
        bean.setAutoRegister( true );
        Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty( "hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect" );
        hibernateProperties.setProperty( "hibernate.jdbc.batch_size", "100" );
        hibernateProperties.setProperty( "hibernate.default_entity_mode", "dom4j" );
        hibernateProperties.setProperty( "hibernate.transaction.factory_class", "org.hibernate.transaction.JDBCTransactionFactory" );
        hibernateProperties.setProperty( "hibernate.current_session_context_class", "org.springframework.orm.hibernate3.SpringSessionContext" );
        bean.setHibernateProperties( hibernateProperties );
        bean.afterPropertiesSet();
        return bean.getObject();
    }

    @Bean ( name = "txManager" )
    public PlatformTransactionManager getTransactionManager() throws Exception
    {
        HibernateTransactionManager txMgr = new HibernateTransactionManager();
        txMgr.setSessionFactory( getSessionFactory() );
        return txMgr;
    }

    @Bean ( name = "jdbcTemplate" )
    public JdbcTemplate getJdbcTemplate()
    {
        return new JdbcTemplate( getDataSource() );
    }

    @Bean ( name = "queryRunner" )
    public QueryRunner getQueryRunner()
    {
        return new QueryRunner( getDataSource() );
    }

    @Bean
    public AnnotationTransactionAttributeSource transactionAttributeSource()
    {
        return new AnnotationTransactionAttributeSource();
    }

    @Bean
    public TransactionInterceptor transactionInterceptor() throws Exception
    {
        return new TransactionInterceptor( getTransactionManager(), transactionAttributeSource() );
    }

    @Bean
    public TransactionAttributeSourceAdvisor internalTransactionAdvisor() throws Exception
    {
        return new TransactionAttributeSourceAdvisor( transactionInterceptor() );
    }

    @Bean
    public InfrastructureAdvisorAutoProxyCreator internalAutoProxyCreator()
    {
        return new InfrastructureAdvisorAutoProxyCreator();
    }
}</pre> 
<div class="blog_h3"><span class="graybg">初始化Spring ApplicationContext的代码</span></div>
<pre class="crayon-plain-tag">ApplicationContext ctx = new AnnotationConfigApplicationContext(BeanDefinitionRegistrar.class);
DataSource ds= ctx.getBean(DataSource.class);</pre> 
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/javaconfig-based-sh">基于JavaConfig方式的Spring+Hibernate集成</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/javaconfig-based-sh/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate知识集锦</title>
		<link>https://blog.gmem.cc/hibernate-faq</link>
		<comments>https://blog.gmem.cc/hibernate-faq#comments</comments>
		<pubDate>Wed, 11 Apr 2012 04:28:04 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[HQL]]></category>
		<category><![CDATA[XRM]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1233</guid>
		<description><![CDATA[<p>重要概念 get和load 在Hibernate 3.6.x中： get会返回实际的对象实例，如果不存在则返回null，session.get(Superclass.class,id)与session.get(Concreteclass,id)的返回值完全一致。 load则返回一个生成的代理（类名以类似_$$_javassist_*结尾），即使给定ID的对象不存在也可以得到代理实例，只有第一次访问其非ID属性时才会从数据库寻找实例，找不到抛出异常。代理的父类就是session.load(Class.class,id)中指定的类，如果在多态映射时不指定具体类型，则不能cast为实际类型。 指定ManyToOne关的FetchType为Lazy时，可能导致关联实体使用类似于load的方式加载（调用SessionImplementor.internalLoad方法），除非指定为其指定注解：@NotFound ( action = NotFoundAction.IGNORE )，相关的Hibernate代码： [crayon-69e20016457c9517674452/] [crayon-69e20016457cd081554799/] 因此使用多态的ManyToOne时，要确保关联对象的类型准确，要么禁止延迟加载，要么启用延迟加载的同时打开 NotFoundAction.IGNORE 实体的状态 状态 说明 New (Transient) 新创建的对象，并且从来没有和Hibernate会话（持久化上下文，persistence <a class="read-more" href="https://blog.gmem.cc/hibernate-faq">[...]</a></p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-faq">Hibernate知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h2">重要概念</div>
<div class="blog_h3"><span class="graybg">get和load</span></div>
<p>在Hibernate 3.6.x中：</p>
<p>get会返回实际的对象实例，如果不存在则返回null，session.get(Superclass.class,id)与session.get(Concreteclass,id)的返回值完全一致。</p>
<p>load则返回一个生成的代理（类名以类似_$$_javassist_*结尾），即使给定ID的对象不存在也可以得到代理实例，只有第一次访问其非ID属性时才会从数据库寻找实例，找不到抛出异常。代理的父类就是session.load(Class.class,id)中指定的类，如果在<span style="background-color: #c0c0c0;">多态映射时不指定具体类型，则不能cast为实际类型</span>。</p>
<p>指定ManyToOne关的FetchType为Lazy时，可能导致关联实体使用类似于load的方式加载（调用SessionImplementor.internalLoad方法），除非指定为其指定注解：@NotFound ( action = NotFoundAction.IGNORE )，相关的Hibernate代码：</p>
<pre class="crayon-plain-tag">protected final Object resolveIdentifier(Serializable id, SessionImplementor session) throws HibernateException {
	boolean isProxyUnwrapEnabled = unwrapProxy &amp;&amp;
			session.getFactory()
					.getEntityPersister( getAssociatedEntityName() )
					.isInstrumented( session.getEntityMode() );
        //EntityType是ManyToOneType的父类，后者的isNullable() == ignoreNotFound，对应@NotFound注解
	Object proxyOrEntity = session.internalLoad(
			getAssociatedEntityName(),
			id,
			eager,
			isNullable() &amp;&amp; !isProxyUnwrapEnabled
	);

	if ( proxyOrEntity instanceof HibernateProxy ) {
		( ( HibernateProxy ) proxyOrEntity ).getHibernateLazyInitializer()
				.setUnwrap( isProxyUnwrapEnabled );
	}

	return proxyOrEntity;
}</pre><br />
<pre class="crayon-plain-tag">public Object internalLoad(String entityName, Serializable id, boolean eager, boolean nullable) throws HibernateException {
		// todo : remove
		LoadEventListener.LoadType type = nullable
                                //如果设置NotFoundAction.IGNORE，则走该分支，不创建代理
				? LoadEventListener.INTERNAL_LOAD_NULLABLE
				: eager
						? LoadEventListener.INTERNAL_LOAD_EAGER //不创建代理
						: LoadEventListener.INTERNAL_LOAD_LAZY; //只有这个会进行代理的创建
		LoadEvent event = new LoadEvent(id, entityName, true, this);
		fireLoad(event, type);
		if ( !nullable ) {
			UnresolvableObjectException.throwIfNull( event.getResult(), id, entityName );
		}
		return event.getResult();
	}</pre>
<p>因此使用多态的ManyToOne时，要确保关联对象的类型准确，要么禁止延迟加载，要么启用延迟加载的同时打开 NotFoundAction.IGNORE</p>
<div class="blog_h3"><span class="graybg">实体的状态</span></div>
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">状态</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>New (Transient)</td>
<td>
<p>新创建的对象，并且从来没有和Hibernate会话（持久化上下文，persistence context）关联过，没有和数据库表的一行关联</p>
<p>要将瞬时对象变为持久化对象，你需要明确的调用持久化API，例如persist</p>
</td>
</tr>
<tr>
<td>Persistent (Managed)</td>
<td>已经关联到数据库表的一行，并且被当前Hibernate管理。对这类对象的<span style="background-color: #c0c0c0;">任何修改都被自动检测到，并自动在flush期间入库</span></td>
</tr>
<tr>
<td>Detached</td>
<td>
<p>如果当前Hibernate会话关闭，则先前Persistent对象变为Detached，之后对实体的更新不会被跟踪因而不会自动入库</p>
<p>要把Detached对象重新关联到Hibernate会话，你可以：</p>
<ol>
<li>Reattaching，通过session.update()方法。注意：在一个会话中，对于每个数据库行，只能有一个JVM对象与之关联</li>
<li>Merging，拷贝Detached对象的字段到一个Managed对象中，如果当前会话中对应Persistent尚不存在则从数据库中抓取。在此操作后，Detached对象的持久化状态不变</li>
</ol>
<p>对于配置了自动生成ID的实体类型，如果手工赋予了ID，会被看作是Detached，即使它是new出来的没有入库过的对象。对这种对象调用session.persist()会导致错误：detached entity passed to persist</p>
</td>
</tr>
<tr>
<td>Removed</td>
<td>
<p>实体对象被从数据库中删除，实际删除动作在flush时发生</p>
<p>JPA要求仅仅Managed对象才可以被删除，但是Hibernate允许调用session.delete删除Detached对象</p>
</td>
</tr>
</tbody>
</table>
<p>实体状态转换示意图：</p>
<p><a href="https://blog.gmem.cc/wp-content/uploads/2012/04/hibernate-entity-state-trans.png"><img class="alignnone size-full wp-image-15172" src="https://blog.gmem.cc/wp-content/uploads/2012/04/hibernate-entity-state-trans.png" alt="hibernate-entity-state-trans" width="100%" /></a></p>
<div class="blog_h3"><span class="graybg">持久化API</span></div>
<p>本节以如下实体来描述常用持久化API的行为：</p>
<pre class="crayon-plain-tag">@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
 
}</pre>
<p>注意下表中的API都不会立即导致SQL操作，SQL操作仅仅在flush时执行。</p>
<table class="full-width fixed-word-wrap">
<thead>
<tr>
<td style="width: 20%; text-align: center;">session.</td>
<td style="text-align: center;">说明</td>
</tr>
</thead>
<tbody>
<tr>
<td>persist</td>
<td>用于将瞬时（new）对象转换为受管状态，例如：<br />
<pre class="crayon-plain-tag">Person person = new Person();
person.setName("Alex");
session.persist(person);</pre></p>
<p>注意该方法的返回值为void，它是直接把入参对象纳入受管状态，而非进行对象状态的拷贝。它的语义严格遵守JSR-220规范：</p>
<ol>
<li>导致瞬时对象变为受管状态，并且对cascade=PERSIST|ALL的关联对象级联此操作</li>
<li>如果对象已经处于受管状态，调用此API无效果，但是级联操作仍然被执行</li>
<li>如果对象处于Detached状态，在此API调用后或者提交/flush时抛出异常</li>
<li>不保证id立即生成 —— <span style="background-color: #c0c0c0;">调用此方法后id可以为null</span>，无论id的生成策略。规范允许在提交/flush时生成id</li>
</ol>
</td>
</tr>
<tr>
<td>save</td>
<td>
<p>该方法是Hibernate原始的持久化接口，不遵守JPA规范。其行为类似于persist但是实现细节不同</p>
<p>该方法执行后，<span style="background-color: #c0c0c0;">立即返回为瞬时对象分配的id</span></p>
<p>如果对Detached对象执行调用save()，<span style="background-color: #c0c0c0;">会生成一个新的id</span></p>
</td>
</tr>
<tr>
<td>update</td>
<td>
<p>该方法是Hibernate原始的持久化接口：</p>
<ol>
<li>在入参对象上进行操作，返回值是void。将入参对象从detached转换为persistent</li>
<li>如果你传入transient对象，抛出异常</li>
</ol>
</td>
</tr>
<tr>
<td>merge</td>
<td>
<p>逻辑如下：</p>
<ol>
<li>根据id从数据库中加载实体</li>
<li>从入参对象拷贝字段到加载的实体</li>
<li>返回加载的实体，该对象与入参是两个对象</li>
</ol>
<p>JSR-220的语义被遵守：</p>
<ol>
<li>如果实体是detached，则拷贝字段到加载的受管实体上</li>
<li>如果实体是transient，则拷贝字段到新建的受管实体上</li>
<li>级联关联的cascade=MERGE|ALL对象</li>
<li>如果实体目前已经是受管的，不拷贝字段，但是级联操作仍然进行</li>
</ol>
</td>
</tr>
<tr>
<td>saveOrUpdate</td>
<td>
<p>Hibernate的特殊API，JPA中没有对应的接口</p>
<p>行为类似于update，可以被用来reattaching一个实例，不管它是transient还是detached</p>
</td>
</tr>
</tbody>
</table>
<div class="blog_h2"><span class="graybg">常见问题</span></div>
<div class="blog_h3"><span class="graybg">Hibernate3使用XRM（EntityMode=dom4j），修改query.list()的dom元素后报错</span></div>
<p>报错信息：<br /> org.springframework.orm.hibernate3.HibernateSystemException: identifier of an instance of *** was altered from 248178 to null; nested exception is org.hibernate.HibernateException: identifier of an instance of wnetJhInterface was altered from 248178 to null<br /> at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:690)<br /> 解决：查询完成后，调用sess.clear();</p>
<div class="blog_h3"><span class="graybg">Hibernate HQL is null问题</span></div>
<p>HQL应该写成：prop is null。不能用参数： prop is :p 并把值传进去</p>
<div class="blog_h3"><span class="graybg">Hibernate setParameter()报错</span></div>
<p>报错信息：Position beyond number of declared ordinal parameters. Remember that ordinal parameters are 1-based! Position: 2<br /> 报错原因：位置参数第一个设置为0，和JDBC不一样，JDBC的索引以1开始</p>
<div class="blog_h3"><span class="graybg">Hibernate setParameter()传递对象给位置参数?报错</span></div>
<p>报错信息：Expected positional parameter count: ?, actual parameters ...<br /> 报错原因：未知，可以使用命名参数（named parameters）解决</p>
<div class="blog_h3"><span class="graybg">如何为HQL命名参数传递多个值(IN子句)</span></div>
<pre class="crayon-plain-tag">String hql = "update user where id in (:id)";
sess = getSessionFactory().getCurrentSession();
Session msess = sess.getSession( EntityMode.MAP );
Query q = msess.createQuery( hql.toString() );
List&lt;Object&gt; params = new ArrayList&lt;Object&gt;();
for ( Map&lt;String, ?&gt; d : dataSet.getAllData() )
{
    params.add( d.get( "id") );
}
q.setParameterList( "id", params );</pre>
<div class="blog_h3"><span class="graybg">Hibernate序列化对象时出错</span></div>
<p>报错信息：org.hibernate.type.SerializationException: could not serialize</p>
<p>报错原因：某些时候Hibernate需要使用Java串行化机制来序列化对象，因此，必须在注解@Transient的同时，为字段添加transient关键字，这样Java串行化机制才能忽略该字段。</p>
<pre class="crayon-plain-tag">@Inject
@Transient
@JsonIgnore
private  transient ServiceHelper     service;</pre>
<div class="blog_h3"><span class="graybg">HQL报错：org.hibernate.QueryException: could not resolve property</span></div>
<ol>
<li>非实体属性不能存在于HQL的SELECT或者WHERE子句中</li>
<li>对于任意多态映射（@Any），即使关联的所有类型的实体均有属性A（通过@MappedSuperclass指定），A亦不能出现在SELECT或者WHERE子句中</li>
</ol>
<div class="blog_h3"><span class="graybg">@AnyMetaDef的@MetaValue的targetEntity不精确到具体子类时，无法保存元数据列的问题</span></div>
<p>在Hibernate 3.6.x中，使用任意多态映射时，如果其中某个关联目标是一个实体类层次，例如：</p>
<pre class="crayon-plain-tag">@AnyMetaDef (
    name = "adminMetaDef",
    idType = "integer",
    metaType = "integer",
    metaValues = {
        @MetaValue ( value = "1", targetEntity = Child.class ),
        //如果Org是一个抽象实体类，其下面有若干个具体实体子类，则在该配置下，任何子实体均无法关联上
        @MetaValue ( value = "2", targetEntity = Org.class )
    } 
)
@Any ( metaDef = "adminMetaDef", metaColumn = @Column ( name = "ADMIN_TYPE") )
@JoinColumn ( name = "ADMIN_ID" )
private Admin mainAdmin;</pre>
<p>则必须把所有子类的@MetaValue全部定义出来，否则在入库时元数据列ADMIN_TYPE保存为null，导致后续无法读取出mainAdmin属性。下面的补丁解决此问题：</p>
<pre class="crayon-plain-tag">public void nullSafeSet( PreparedStatement st, Object value, int index, SessionImplementor session )
        throws HibernateException, SQLException
{
    baseType.nullSafeSet( st, value == null ? null : getKey( value ), index, session );
}
private Object getSuperclass( Object clsName )
{
    try
    {
        Class&lt;?&gt; c = Class.forName( clsName.toString() );
        return c.getSuperclass().getName();
    }
    catch ( Exception e )
    {
        return null;
    }
}

private Object getKey( Object clsName )
{
    Object key = this.keys.get( clsName );
    if ( key == null )
    {
        return getKey( getSuperclass( clsName ) );
    }
    return key;
}</pre>
<p>应用上述补丁之后，加载对象后，发现mainAdmin属性的类型与其真实类型不对应，其类型是@metaValue中声明的Org类，下面的补丁解决此问题：</p>
<pre class="crayon-plain-tag">//修改此文件的130、210、216行，改为调用下面的方法：

private Object internalLoad( String entityName, Serializable id, SessionImplementor session )
{
    //这边第三个参数改为true，即禁止了延迟加载，避免了代理对象类型不正确的问题
    return session.internalLoad( entityName, id, true, false );
}
//上面的方法返回的对象不是代理，和原代码语义可能存在不一致（本人未验证）</pre>
<div class="blog_h2"><span class="graybg">配置示例</span></div>
<div class="blog_h3"><span class="graybg">Spring配置：Hibernate4</span></div>
<pre class="crayon-plain-tag">&lt;bean id="sessionFactory" p:dataSource-ref="dataSource" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;
        &lt;property name="packagesToScan"&gt;
            &lt;list&gt;
                &lt;value&gt;cc.gmem.mgr.*.model&lt;/value&gt;
            &lt;/list&gt;
        &lt;/property&gt;
        &lt;property name="hibernateProperties"&gt;
            &lt;value&gt;
                hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
                hibernate.jdbc.batch_size=20
                hibernate.show_sql=false
                hibernate.format_sql=false
                hibernate.generate_statistics=true
                hibernate.transaction.factory_class=org.hibernate.transaction.JDBCTransactionFactory
                hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
            &lt;/value&gt;
        &lt;/property&gt;
    &lt;/bean&gt;
    &lt;bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
        p:sessionFactory-ref="sessionFactory" /&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-faq">Hibernate知识集锦</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/hibernate-faq/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate基于注解的配置样例</title>
		<link>https://blog.gmem.cc/hibernate-annotation-based-configurations</link>
		<comments>https://blog.gmem.cc/hibernate-annotation-based-configurations#comments</comments>
		<pubDate>Fri, 24 Dec 2010 03:35:43 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[配置文件]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=3571</guid>
		<description><![CDATA[<p>实体类上的常用注解 [crayon-69e2001645bca123472305/] 使用注解方式进行对象-数据库映射时，应当以JPA注解为主，仅Hibernate特有的功能则使用其私有的注解类。 简单主键和简单属性映射 [crayon-69e2001645bce087181456/] 复合主键映射 [crayon-69e2001645bd1452817398/] 嵌入式（embeddable）对象映射 [crayon-69e2001645bd3499498562/] 关联映射 [crayon-69e2001645bd6116076947/] 继承映射 [crayon-69e2001645bd9434603216/] 其它注解 [crayon-69e2001645bdb140433663/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-annotation-based-configurations">Hibernate基于注解的配置样例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">实体类上的常用注解</span></div>
<pre class="crayon-plain-tag">@Entity ( name = "ChristmasTree" )
@Table ( name = "T_CRISMS_TREE" )
//给自动生成的表添加注释
@org.hibernate.annotations.Table ( appliesTo = "T_CRISMS_TREE", comment = "圣诞树" )
@Cacheable  //JPA注解，表示该类型的实体支持缓存
//启用二级缓存时有意义，指定Hibernate缓存策略、存放区域
@Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
public class ChristmasTree
{
    //集合属性的缓存策略必须单独配置
    @Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
    private List branches;
}</pre>
<p>使用注解方式进行对象-数据库映射时，应当以JPA注解为主，仅Hibernate特有的功能则使用其私有的注解类。</p>
<div class="blog_h3"><span class="graybg">简单主键和简单属性映射</span></div>
<pre class="crayon-plain-tag">//简单的主键映射
@Id  //该注解指明此实体的标识符属性，对应了关系型数据库的主键
@Column ( name = "ID", columnDefinition = "int(11) comment '主键'" )
private Integer id;

//UUID方式的主键生成器配置，其它任何自定义的主键生成器可以依样扩展
@Id
@Column ( name = "ID", columnDefinition = "varchar(36) comment '主键,36位UUID'" )
@GeneratedValue ( generator = "uuid" )
@GenericGenerator ( name = "uuid", strategy = "org.hibernate.id.UUIDGenerator" )
private String            id;

//可以指定普通属性的延迟加载
@Basic ( fetch = FetchType.EAGER, optional = true )
@Column ( name = "BUILD_COST", columnDefinition = "decimal(10,2) comment '建造费用'" )
private BigDecimal buildCost;

//时间映射
//只能用于java.util.Date或者java.util.Calendar，用于表示日期、时间或者时间戳
@Temporal ( TemporalType.TIMESTAMP )
@Column ( name = "BUILD_TIME", columnDefinition = "datetime comment '建造时间'" )
private Date buildTime;

//大字段映射
@Lob
@Column ( name = "REMARK", columnDefinition = "longtext comment '圣诞树备注信息'" )
private String remark;

//枚举类型映射
@Enumerated ( EnumType.ORDINAL )
//根据枚举元素的声明顺序，从0开始
@Column ( name = "STATUS", columnDefinition = "tinyint comment '状态'" )
private Status status;


//乐观并发控制用列
@Version
@Column ( name = "VERSION" )
public Integer version;</pre>
<div class="blog_h3"><span class="graybg">复合主键映射</span></div>
<pre class="crayon-plain-tag">//复合主键映射
@Embeddable
public class TreeId 
{
    @Column ( name = "ORG_ID" )
    private Integer org;
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}
//可以覆写默认映射
@EmbeddedId
@AttributeOverride ( name = "seq", column = @Column (name = "SEQ_NO" ) )
private TreeId treeId;
//复合主键中甚至可以包含实体类
@Embeddable
public class TreeId
{
    @ManyToOne
    @JoinColumn  (name = "ORG_ID", referencedColumnName="ID" )
    private Org org;
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}
//也可以使用多个属性作为主键
public class ChristmasTree
{
    @Id
    @OneToOne
    @JoinColumn (name = "ORG_ID", referencedColumnName="ID" )
    private Org org;

    @Id
    @Column ( name = "SEQ_ID" )
    private Integer seq;
}</pre>
<div class="blog_h3"><span class="graybg">嵌入式（embeddable）对象映射</span></div>
<pre class="crayon-plain-tag">//嵌入式对象映射，也叫组件映射
@Embeddable
public class Country 
{
    @ManyToOne
    @JoinColumn (name = "ORG_ID", referencedColumnName="ID" )
    private Org adminOrg;
    private String name;
}
@Embeddable
public class Address implements Serializable 
{
    String city;
    Country nationality; // 递归嵌入
}
@Entity
public class Person implements Serializable 
{

    private Address homeAddress; //由于Address声明为@Embeddable，所以自动进行组件映射
    @Embedded
    @AttributeOverrides( { //进行映射覆写
        @AttributeOverride ( name = "adminOrg", column = @Column ( name = "ADMIN_ORG_ID" ) ),
        @AttributeOverride ( name = "name", column = @Column ( name = "COUNTRY_NAME" ) )
    } )
    Country bornIn;
}

//嵌入式对象的集合也可以被映射，注意子表不需要主键，也没有实体地位
@Embeddable
public class Address implements Comparable&lt;Address&gt;
{
    @Column ( name = "ZIP_CODE" )
    private Integer zip;

    @Column ( name = "STREET" )
    private String  street;
}
@Entity
@Table ( name = "T_PERSON" )
public class Person
{
    @Id
    private Integer      id;

    @ElementCollection
    @CollectionTable ( name = "T_ADDRESS", joinColumns = @JoinColumn ( name = "PERSON_ID" ) )
    //两种定义集合元素顺序的方法：
    @Sort ( type = SortType.NATURAL )
    @OrderBy ( "zip DESC" )
    private Set&lt;Address&gt; addresses;
}</pre>
<div class="blog_h3"><span class="graybg">关联映射</span></div>
<pre class="crayon-plain-tag">//基于主键共享的一对一关联
public class ChristmasTree 
{
    @Id
    private Long id;
 
    @OneToOne ( cascade = CascadeType.ALL, optional = false )
    @MapsId  //共享主键
    private TreeRoot root; 
}
public class TreeRoot 
{
    @Id
    private Long id;
}
//基于外键的多对一关联
@ManyToOne (
    fetch = FetchType.EAGER,//默认非延迟加载
    optional = false //是否可选，如果设置为真则允许为空，默认否
)
@JoinColumn ( /*本表外键列*/
    name = "ROOM_ID", 
    columnDefinition = "varchar(36) comment '所在房间'" ,
    referencedColumnName = "NOT_PK_COLUMN" //可以指定不和目标表的主键，而是其它唯一键列进行映射
)
@NotFound ( action = NotFoundAction.IGNORE ) //当对应数据找不到的时候，是否抛出异常
@OnDelete ( action = OnDeleteAction.CASCADE ) //父表ROOM的数据被删除时，在数据库级别自动级联删除当前表的相关数据
@ForeignKey (name = "FK_CRISMS_TREE_ROOM" ) //指定外键名称
private Room              room;

//基于映射表的多对一关联
@ManyToOne
@JoinTable (
    name = "T_M_CRISMS_TREE_ROOM",
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "ROOM_ID" ) )
private Room room;
//多对多关联
@ManyToMany
@JoinTable ( /*映射表*/
    name = "T_M_CRISMS_TREE_CHILD",
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "CHILD_ID" ) )
private Set        children;

//一对多映射：有序集合
@OneToMany (
    fetch = FetchType.LAZY,//延迟加载（直到第一次访问时才加载），集合默认真
    orphanRemoval = true,//是否在目标实体从集合中移除时，对其进行删除
    targetEntity = AbstractFurit.class,//目标实体，不使用泛型时，必须指定
    cascade = CascadeType.ALL //在进行各种增删改操作时，关联的目标实体是否也要进行同样的操作
)
@JoinColumn ( /*子表外键列*/name = "TREE_ID", columnDefinition = "varchar(36) comment '该水果挂在哪棵树上'" )
//集合属性可以设置（在Java中的）排序方式
@Sort ( type = SortType.NATURAL )
private SortedSet furits;               //如果不需要支持排序，可以使用Set接口

//一对多映射：列表
@OneToMany
@JoinColumn ( name = "TREE_ID", columnDefinition = "varchar(36) comment '该树枝是哪棵树的'" )
//子表索引列必须为整数，从0开始，不得跳跃
@IndexColumn ( name = "ORD", columnDefinition = "int(11) comment '序号'" )
@Cache ( usage = CacheConcurrencyStrategy.READ_WRITE, region = "entityCache" )
private List      branches;

//任意多态映射，关联目标不再同一个实体层次下
@AnyMetaDef (
    //该元数据可以在包上定义，以便重用
    name = "adminMetaDef",
    idType = "string", //目标实体的标识符类型
    metaType = "integer", //元数据列的数据类型
    metaValues = {
        @MetaValue ( value = "1", targetEntity = Child.class ),
        @MetaValue ( value = "2", targetEntity = Org.class )
    } )
@Any ( metaDef = "adminMetaDef",
       metaColumn = @Column ( name = "ADMIN_TYPE", columnDefinition = "int(11) comment '管理者类别:1孩子,2机构'" ) )
@JoinColumn ( name = "ADMIN_ID", columnDefinition = "varchar(36) comment '圣诞树主管理者'" )
private Admin             mainAdmin;

//任意多态集合映射
@ManyToAny ( metaDef = "adminMetaDef", metaColumn = @Column ( name = "ADMIN_TYPE" ) )
@JoinTable (
    name = "T_M_CRISMS_TREE_ADMIN", //必须使用映射表，以便指定元数据列
    joinColumns = @JoinColumn ( name = "TREE_ID" ),
    inverseJoinColumns = @JoinColumn ( name = "ADMIN_ID" ) )
private Set        admins;</pre>
<div class="blog_h3"><span class="graybg">继承映射</span></div>
<pre class="crayon-plain-tag">//*** 整个实体层次使用单张表
@Entity ( name = "AbstractFurit" )
@Table ( name = "T_FURIT" )
@Inheritance ( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn ( name = "TYPE_ID", columnDefinition = "int(11) comment '水果类型'" )
public class AbstractFurit implements IFurit, Serializable
{}
@Entity ( name = "Apple" )
@DiscriminatorValue ( "1" )
public class Apple extends AbstractFurit
{}

//*** 公共属性放在一张表，子类中的属性放在各自单独表中
@Entity ( name = "AbstractFurit" )
@Table ( name = "T_FURIT" )
@Inheritance ( strategy = InheritanceType.JOINED )
public class AbstractFurit implements IFurit, Serializable
{
    @id
    private Integer id;
}
@Entity ( name = "Apple" )
@Table ( name = "T_APPLE" )
@PrimaryKeyJoinColumn ( name = "FURIT_ID" )
public class Apple extends AbstractFurit
{}

//*** 每个子类使用一张表
@Entity ( name = "AbstractFurit" )
@Inheritance ( strategy = InheritanceType.TABLE_PER_CLASS )
public class AbstractFurit implements IFurit, Serializable
{}</pre>
<div class="blog_h3"><span class="graybg">其它注解</span></div>
<pre class="crayon-plain-tag">//领域驱动风格的建模时，实体的瞬时属性，必须同时使用注解和关键字
@Inject
@Transient //表示该字段不支持持久化
@JsonIgnore //结合JacksonJSON使用，忽略无业务意义的字段
private transient ServiceHelper   service; //指定transient关键字，不会在Java串行化时尝试串行化该字段

//公式列，可以使用SQL表达式定义一个只读的列，在数据库端完成计算
@Formula("length * height * width")
private long volume;

// 一个或者多个字段可以作为自然键的组成，具有惟一性非空约束
@NaturalId ( mutable = true ) //可以配置自然键是否可变
@Column ( name = "COLOR", columnDefinition = "varchar(50) comment '颜色'" )
private String color;

//定义一个用于继承的父类，该父类不具有实体资格，但是可以定义若干公用的映射属性
@MappedSuperclass
public class Admin
{
    @Column ( name = "NAME" )
    private String name;
}
@Entity ( name = "Child" )
//可以在上述父类的某个作为实体层次根的子类上，对属性（AttributeOverride）、关联映射（AssociationOverride）进行覆写
@AttributeOverride ( name = "name", column = @Column ( name = "CHILD_NAME" ) )
public class Child extends Admin
{}

//把一个实体映射到多张表上，这种映射方式支持在实体层次（例如单表/类层次）中的某个分支上使用
@SecondaryTables ( {
    @SecondaryTable ( name = "T_CRISMS_TREE_OTHER", pkJoinColumns = {
        @PrimaryKeyJoinColumn ( name = "cat_id", referencedColumnName = "id" ) }
    ),
    @SecondaryTable ( name = "T_CRISMS_TREE_OTHER_2" )
} )
public class ChristmasTree implements Serializable
{
    @Column ( table = "T_CRISMS_TREE_OTHER" ) //指定某个列存放在哪张表上
    private String otherInfo;
}</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-annotation-based-configurations">Hibernate基于注解的配置样例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/hibernate-annotation-based-configurations/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hibernate基于XML的配置文件样例</title>
		<link>https://blog.gmem.cc/hibernate-xml-configuration-sample</link>
		<comments>https://blog.gmem.cc/hibernate-xml-configuration-sample#comments</comments>
		<pubDate>Sun, 12 Jul 2009 03:11:40 +0000</pubDate>
		<dc:creator><![CDATA[Alex]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[XRM]]></category>
		<category><![CDATA[配置文件]]></category>

		<guid isPermaLink="false">http://blog.gmem.cc/?p=1218</guid>
		<description><![CDATA[<p>Hibernate 3.0配置文件 [crayon-69e2001645f7a446646693/] XRM配置文件样例 XRM是Hibernate3里面的一个试验性功能，用于在数据库和XML文件之间进行映射 [crayon-69e2001645f7e366947483/]</p>
<p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-xml-configuration-sample">Hibernate基于XML的配置文件样例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></description>
				<content:encoded><![CDATA[<div class="wri_content_clear_both"><div class="blog_h3"><span class="graybg">Hibernate 3.0配置文件</span></div>
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                                         "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
&lt;hibernate-configuration&gt;
 &lt;session-factory name="cpdb"&gt;
  &lt;property name="hibernate.connection.driver_class"&gt;oracle.jdbc.driver.OracleDriver&lt;/property&gt;
  &lt;property name="hibernate.connection.password"&gt;CASTOR&lt;/property&gt;
  &lt;property name="hibernate.connection.url"&gt;jdbc:oracle:thin:@RD-DB-5.sparknet.com.cn:1522:CPDB&lt;/property&gt;
  &lt;property name="hibernate.connection.username"&gt;CASTOR&lt;/property&gt;
  &lt;property name="hibernate.dialect"&gt;org.hibernate.dialect.Oracle10gDialect&lt;/property&gt;
  &lt;property name="hibernate.jdbc.batch_size"&gt;20&lt;/property&gt;
  &lt;property name="hibernate.show_sql"&gt;true&lt;/property&gt;
  &lt;property name="hibernate.format_sql"&gt;true&lt;/property&gt;
  &lt;property name="hibernate.generate_statistics"&gt;true&lt;/property&gt;
  &lt;property name="hibernate.current_session_context_class"&gt;thread&lt;/property&gt;
 &lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;</pre>
<div class="blog_h3"><span class="graybg">XRM配置文件样例</span></div>
<p>XRM是Hibernate3里面的一个试验性功能，用于在数据库和XML文件之间进行映射</p>
<pre class="crayon-plain-tag">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" &gt;
&lt;hibernate-mapping package="sparknet.traing.hxm.model"&gt;
	&lt;class entity-name="Corp" node="corp" table="T_CORP"&gt;
		&lt;comment&gt;
			&lt;![CDATA[
				Corporation basic information
			]]&gt;
		&lt;/comment&gt;
		&lt;!-- 复合主键的映射 --&gt;
		&lt;composite-id name="id" node="-"&gt;
			&lt;key-property name="org" node="org" type="long"&gt;
				&lt;column name="ORG" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;database Code&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="id" node="id" type="long"&gt;
				&lt;column name="ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;corporation identifier&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="seqId" node="seq-id" type="long"&gt;
				&lt;column name="SEQ_ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;changing sequence&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;generator class="foreign"&gt;
				&lt;param name="property"&gt;corpOther&lt;/param&gt;
			&lt;/generator&gt;
		&lt;/composite-id&gt;
		&lt;!-- 普通属性的映射 --&gt;
		&lt;property name="corpName" node="corp-name" type="string" unique="true" unique-key="UK_CORP_NAME"&gt;
			&lt;column name="CORP_NAME" sql-type="VARCHAR(64)"&gt;
				&lt;comment&gt;corporation name&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="regCapi" node="reg-capi" type="currency"&gt;
			&lt;column name="REG_CAPI" sql-type="NUMBER(14,2)"&gt;
				&lt;comment&gt;registered capital&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="startDate" node="start-date" type="fmt_date"&gt;
			&lt;column name="START_DATE" sql-type="DATE"&gt;
				&lt;comment&gt; corporation start date&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="startTime" node="start-time" type="fmt_time"&gt;
			&lt;column name="START_TIME" sql-type="DATE"&gt;
				&lt;comment&gt; corporation start time&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;!-- 组件映射 --&gt;
		&lt;component name="address" node="addr" lazy="true"&gt;
			&lt;property name="street" node="street" type="string"&gt;
				&lt;column name="STREET" sql-type="VARCHAR2(128)"&gt;
					&lt;comment&gt;address of street&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/property&gt;
			&lt;property name="building" node="building" type="string"&gt;
				&lt;column name="BUILDING" sql-type="VARCHAR2(128)"&gt;
					&lt;comment&gt;building&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/property&gt;
			&lt;property name="zipCode" node="zip-code" type="int"&gt;
				&lt;column name="ZIP" sql-type="NUMBER(6)"&gt;
					&lt;comment&gt;zip code&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/property&gt;
		&lt;/component&gt;
		&lt;!-- 共享主键的一对一关联，目前这个版本，会导致当前Class的主键不能映射到XML中? --&gt;
		&lt;one-to-one name="corpOther" entity-name="AdvancedCorpInfo" node="corp-other-info" constrained="true" cascade="all" /&gt;
		&lt;!-- 多对一映射 --&gt;
		&lt;many-to-one name="city" entity-name="City" embed-xml="true" node="city-code" cascade="all"&gt;
			&lt;column name="CITY_ID" sql-type="NUMBER(8)"&gt;
				&lt;comment&gt;address of city&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/many-to-one&gt;
		&lt;many-to-one name="gongShangOrg" node="belong-dist-org" entity-name="GongShangOrg" cascade="all"&gt;
			&lt;column name="GS_ORG" sql-type="NUMBER(8)"&gt;&lt;/column&gt;
			&lt;column name="GS_ID" sql-type="NUMBER(8)"&gt;&lt;/column&gt;
			&lt;column name="GS_SEQ_ID" sql-type="NUMBER(8)"&gt;&lt;/column&gt;
		&lt;/many-to-one&gt;
		&lt;!-- 基于连接表的一对多双向关联,One端--&gt;
		&lt;list name="stocks" embed-xml="true" node="stocks-of-corp" cascade="all,delete-orphan" batch-size="20" table="T_M_CORP_STOCK"&gt;
			&lt;key not-null="true" foreign-key="FK_CORP_STOCK"&gt;
				&lt;column name="CORP_ORG" sql-type="NUMBER(8)" /&gt;
				&lt;column name="CORP_ID" sql-type="NUMBER(8)" /&gt;
				&lt;column name="CORP_SEQ_ID" sql-type="NUMBER(8)" /&gt;
			&lt;/key&gt;
			&lt;list-index&gt;
				&lt;column name="ORD"&gt;
					&lt;comment&gt;list index&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/list-index&gt;
			&lt;many-to-many unique="true" entity-name="Stock" node="stock" embed-xml="true"&gt;
				&lt;column name="STOCK_ORG" sql-type="NUMBER(8)" /&gt;
				&lt;column name="STOCK_ID" sql-type="NUMBER(8)" /&gt;
				&lt;column name="STOCK_SEQ_ID" sql-type="NUMBER(8)" /&gt;
			&lt;/many-to-many&gt;
		&lt;/list&gt;
        &lt;!-- 基于外键的一对多关联,One端 --&gt;
        &lt;set name="oldStocks"&gt;
            &lt;key&gt;
                &lt;column name="CORP_ORG" sql-type="NUMBER(8)" /&gt;
                &lt;column name="CORP_ID" sql-type="NUMBER(8)" /&gt;
                &lt;column name="CORP_SEQ_ID" sql-type="NUMBER(8)" /&gt;
            &lt;/key&gt;
            &lt;one-to-many entity-name="stock"/&gt;
        &lt;/set&gt;
		&lt;property name="timestamp" node="timestamp" type="fmt_date_time"&gt;
			&lt;column name="STATE_DATE"&gt;
				&lt;comment&gt;Version column&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
	&lt;/class&gt;
	&lt;class entity-name="Stock" node="Stock" table="T_STOCK"&gt;
		&lt;composite-id name="id" node="identifier"&gt;
			&lt;key-property name="org" node="org" type="long"&gt;
				&lt;column name="ORG" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;database Code&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="id" node="id" type="long"&gt;
				&lt;column name="ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;stock identifier&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="seqId" node="seq-id" type="long"&gt;
				&lt;column name="SEQ_ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;changing sequence&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;generator class="assigned" /&gt;
		&lt;/composite-id&gt;
		&lt;property name="stockName" node="stock-name" not-null="true" type="string"&gt;
			&lt;column name="NAME" sql-type="VARCHAR2(64)"&gt;
				&lt;comment&gt;stock's name&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="stockType" node="stock-type" type="string"&gt;
			&lt;column name="STOCK_TYPE" sql-type="VARCHAR2(64)"&gt;
				&lt;comment&gt;type of a stock&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="stockRegCapi" node="stock-registered-capital" type="double"&gt;
			&lt;column name="STOCK_REG_CAPI" sql-type="NUMBER(12,2)"&gt;
				&lt;comment&gt;registered capital of a stock&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="stockActualCapi" node="stock-actual-capital" type="double"&gt;
			&lt;column name="STOCK_ACTUAL_CAPI" sql-type="NUMBER(12,2)"&gt;
				&lt;comment&gt;actual capital of a stock&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="capiType" node="captial-type" type="string"&gt;
			&lt;column name="CAPI_TYPE" sql-type="VARCHAR2(64)"&gt;
				&lt;comment&gt;capi type of a stock&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;!-- 基于连接表的一对多双向关联,Many端 --&gt;
		&lt;join table="T_M_CORP_STOCK" inverse="true" optional="true"&gt;
			&lt;key not-null="true" foreign-key="FK_CORP_STOCK"&gt;
				&lt;column name="STOCK_ORG" sql-type="NUMBER(8)" /&gt;
				&lt;column name="STOCK_ID" sql-type="NUMBER(8)" /&gt;
				&lt;column name="STOCK_SEQ_ID" sql-type="NUMBER(8)" /&gt;
			&lt;/key&gt;
			&lt;!-- 注意：在本Sample中，如果下行embed-xml设置为true则导致循环引用，XML处理出错 --&gt;
			&lt;many-to-one name="corp" embed-xml="false" entity-name="Corp" node="corp-ref"&gt;
				&lt;column name="CORP_ORG" sql-type="NUMBER(8)" /&gt;
				&lt;column name="CORP_ID" sql-type="NUMBER(8)" /&gt;
				&lt;column name="CORP_SEQ_ID" sql-type="NUMBER(8)" /&gt;
			&lt;/many-to-one&gt;
		&lt;/join&gt;
	&lt;/class&gt;
	&lt;class entity-name="GongShangOrg" node="org" table="T_DICT_ORG"&gt;
		&lt;composite-id name="id" node="-"&gt;
			&lt;key-property name="org" node="org" type="long"&gt;
				&lt;column name="ORG" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;database Code&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="id" node="id" type="long"&gt;
				&lt;column name="ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;gong shang org identifier&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="seqId" node="seq-id" type="long"&gt;
				&lt;column name="SEQ_ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;changing sequence&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;generator class="assigned" /&gt;
		&lt;/composite-id&gt;
		&lt;property name="orgName" node="org-name" type="string"&gt;
			&lt;column name="NAME" sql-type="VARCHAR2(64)"&gt;
				&lt;comment&gt;city name&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
	&lt;/class&gt;
	&lt;class entity-name="AdvancedCorpInfo" node="adv-corp-info" table="T_CORP_OTHER"&gt;
		&lt;composite-id name="id" node="-"&gt;
			&lt;key-property name="org" node="org" type="long"&gt;
				&lt;column name="ORG" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;database Code&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="id" node="id" type="long"&gt;
				&lt;column name="ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;corporation identifier&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;key-property name="seqId" node="seq-id" type="long"&gt;
				&lt;column name="SEQ_ID" sql-type="NUMBER(8)"&gt;
					&lt;comment&gt;changing sequence&lt;/comment&gt;
				&lt;/column&gt;
			&lt;/key-property&gt;
			&lt;generator class="assigned" /&gt;
		&lt;/composite-id&gt;
		&lt;property name="webSite" node="web-site" type="string"&gt;
			&lt;column name="WEB_URL" sql-type="VARCHAR2(128)"&gt;
				&lt;comment&gt;web site url&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="citySign" node="city-or-village" type="boolean"&gt;
			&lt;column name="CITY_SIGN" sql-type="NUMBER(1)"&gt;
				&lt;comment&gt;city village flag&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
	&lt;/class&gt;
	&lt;class entity-name="City" node="City" table="T_DICT_CITY"&gt;
		&lt;comment&gt;
			&lt;![CDATA[
				City dictionary
			]]&gt;
		&lt;/comment&gt;
        &lt;!-- 简单主键映射 --&gt;
		&lt;id name="cityId" node="-" type="long" &gt;
			&lt;column name="CITY_ID" sql-type="NUMBER(8)"&gt;
				&lt;comment&gt;city identifier&lt;/comment&gt;
			&lt;/column&gt;
			&lt;generator class="sequence"&gt;
				&lt;param name="sequence"&gt;SEQ_HXM&lt;/param&gt;
			&lt;/generator&gt;
		&lt;/id&gt;
		&lt;property name="cityName" node="-" type="string"&gt;
			&lt;column name="NAME" sql-type="VARCHAR2(64)"&gt;
				&lt;comment&gt;city name&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
		&lt;property name="cityCode" node="." type="int"&gt;
			&lt;column name="CODE" sql-type="NUMBER(4)"&gt;
				&lt;comment&gt;city code&lt;/comment&gt;
			&lt;/column&gt;
		&lt;/property&gt;
	&lt;/class&gt;
&lt;/hibernate-mapping&gt;</pre>
</div><p>The post <a rel="nofollow" href="https://blog.gmem.cc/hibernate-xml-configuration-sample">Hibernate基于XML的配置文件样例</a> appeared first on <a rel="nofollow" href="https://blog.gmem.cc">绿色记忆</a>.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.gmem.cc/hibernate-xml-configuration-sample/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
