【发布时间】:2012-02-13 13:57:27
【问题描述】:
有没有办法在hibernate.cfg.xml中按范围而不是一个一个地定义对象?
例如在Spring中你可以通过这样的注解来定义所有的控制器:
<context:component-scan base-package="crm.controller" />
我可以用同样的方式定义休眠类吗?还是必须一一定义?
谢谢
【问题讨论】:
标签: java hibernate spring-mvc
有没有办法在hibernate.cfg.xml中按范围而不是一个一个地定义对象?
例如在Spring中你可以通过这样的注解来定义所有的控制器:
<context:component-scan base-package="crm.controller" />
我可以用同样的方式定义休眠类吗?还是必须一一定义?
谢谢
【问题讨论】:
标签: java hibernate spring-mvc
如果您使用的是 Spring MVC,则可以在设置 sessionFactory 时对其进行配置。如果您使用的是 hbm 文件:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>file1.hbm.xml</value>
<value>file2.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties" ref="hibernateProperties"/>
</bean>
如果您使用带注释的类:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.me.domain">
<property name="hibernateProperties" ref="hibernateProperties"/>
</bean>
【讨论】:
尝试使用:
<mapping package="com.mycompany.model" />
而不是一组元素:
<mapping class="com.mycompany.model.EntytyOne" />
<mapping class="com.mycompany.model.EntytyTwo" />
【讨论】:
你为什么不试试这个。我在 springDAOcontext.xml 中配置了这个
<bean id="csiSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate/hibernate.cfg.xml</value>
</property>
<property name="dataSource" ref="DataSource"/>
<property name="mappingResources">
<list>
<value>hibernate/*</value>
</list>
<property>
【讨论】:
据我所知,开箱即用的 Hibernate 不支持“package-sanning”来发现您的域类。
但鉴于您正在将 Hibernate 与 Spring MVC 集成,您可以注释您的类(标准 JPA + Hibernate 特定注释)并在您的 Spring 上下文配置文件中,指定包含 Hibernate 实体类的包。这是我在以前的项目中配置它的方式:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="org.springmvc.domain" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="show_sql">true</prop>
<prop key="log_level">DEBUG</prop>
</props>
</property>
</bean>
“packagesToScan”属性定义 Spring 将通过 Hibernate 扫描以发现实体类的包。
【讨论】:
我使用jpa注解@Entity,applicationContext.xml的代码是:
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.yourcompany.module" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
</props>
</property>
</bean>
包路径“com.yourcompany.module”就是你的java实体包,例如:
package com.yourcompany.module;
@Entity
class MyEntity{
private Long id;
set get...
}
【讨论】: