Config Spring用于使用hibernate和通过注释映射的实体

时间:2010-10-28 11:24:36

标签: java hibernate spring

即时通讯使用hibernate,我用注释映射我的实体(所以没有xml文件)。

我最终决定尝试使用spring框架,但是我遇到了一些问题才能使它工作。

我发现的所有教程都非常分散,大多数都使用xml文件来映射实体... 你能帮我正确编写spring + hibernate的xml配置文件吗?

感谢。

2 个答案:

答案 0 :(得分:7)

以下是我的某个应用中的工作示例。 它们都应该放在applicationContext或appContext加载的.xml中。

第一个片段是数据源的配置,使用连接池:

<bean id="dataSource"
    class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
    p:driverClass="${jdbc.driverClassName}"
    p:jdbcUrl="${jdbc.url}"
    p:user="${jdbc.username}"
    p:password="${jdbc.password}" />

接下来是一个Property bean。如果您不确定这些设置,请参阅相应的API。

<bean id="hibernateProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="properties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.c3p0.minPoolSize">5</prop>
            <prop key="hibernate.c3p0.maxPoolSize">20</prop>
            <prop key="hibernate.c3p0.idleTestPeriod">300</prop>
            <prop key="hibernate.c3p0.timeout">600</prop>
            <prop key="hibernate.c3p0.max_statement">50</prop>
            <prop key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
            <prop key="hibernate.c3p0.preferredTestQuery">select 1;</prop>
        </props>
    </property>
</bean>

现在这是有趣的部分。在这里,您将它们连接在一起并告诉sessionfactory在哪里查找带注释的类(packagesToScan)。

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
      p:dataSource-ref="dataSource"
      p:packagesToScan="your.package.path"
      p:hibernateProperties-ref="hibernateProps" />

要使此示例有效,您应该使用以下依赖项(为maven指定):

    <dependency>
        <groupId>javax.persistence</groupId>
        <artifactId>persistence-api</artifactId>
        <version>1.0</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>3.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>3.0.2.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate</artifactId>
        <version>3.2.7.ga</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>3.3.0.ga</version>
    </dependency>

    <dependency>
        <groupId>c3p0</groupId>
        <artifactId>c3p0</artifactId>
        <version>0.9.1</version>
    </dependency>

当您像这样设置项目时,以下@Entity映射由spring自动管理:

package your.package.path;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "table_name")
public class DomainObject implements Serializable {

.
.
.
}

如果您有任何其他问题,请告诉我们。

问候

答案 1 :(得分:1)

如果您使用JPA(EntityManager),则会自动发现@Entity个类。

在春季,您通过EntityManager获取LocalEntityManagerFactoryBean,然后将@PersistenceContext注入您的课程。 Check here了解更多信息