春季JPA和持久性.xml

2022-09-01 21:15:56

我正在尝试设置一个Spring JPA Hibernate的简单示例WAR,用于部署到Glassfish。我看到一些示例使用持久性.xml文件,而其他示例则没有。有些示例使用数据源,有些则不使用。到目前为止,我的理解是,如果我有以下情况,则不需要数据源:

<persistence-unit name="educationPU"
    transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>com.coe.jpa.StudentProfile</class>
    <properties>
        <property name="hibernate.connection.driver_class"
            value="com.mysql.jdbc.Driver" />
        <property name="hibernate.connection.url"
            value="jdbc:mysql://localhost:3306/COE" />
        <property name="hibernate.connection.username" value="root" />
        <property name="show_sql" value="true" />
        <property name="dialect" value="org.hibernate.dialect.MySQLDialect" />
    </properties>
</persistence-unit>

我可以很好地部署,但是我的EntityManager没有被Spring注入。

我的应用程序上下文.xml:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="educationPU" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="StudentProfileDAO" class="com.coe.jpa.StudentProfileDAO">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="studentService" class="com.coe.services.StudentService">
</bean>

我与实体管理器的类:

public class StudentService {
private String  saveMessage;
private String  showModal;
private String modalHeader;
private StudentProfile studentProfile;
private String lastName;
private String firstName;

@PersistenceContext(unitName="educationPU")
private EntityManager em;

@Transactional
public String save()
{
    System.out.println("*** em: " + this.em); //em is null
    this.studentProfile= new StudentProfile();
    this.saveMessage = "saved";
    this.showModal = "true";
    this.modalHeader= "Information Saved";
    return "successs";
}

我的网站.xml:

  <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

我是否缺少任何部分来让Spring将“em”注入学生服务?


答案 1

只是为了确认,尽管你可能做到了...

您是否包括

<!--  tell spring to use annotation based congfigurations -->
<context:annotation-config />
<!--  tell spring where to find the beans -->
<context:component-scan base-package="zz.yy.abcd" />

应用程序上下文中的位.xml?

另外,我不太确定您是否能够通过这种设置使用jta事务类型?这难道不需要数据源托管连接池吗?因此,请尝试RESOURCE_LOCAL。


答案 2

我很困惑。您是将 PU 注入服务层而不是持久性层?我不明白。

我将持久性层注入到服务层中。服务层包含业务逻辑并划分事务边界。它可以在事务中包含多个 DAO。

我也没有在你的save()方法中得到魔力。如何保存数据?

在生产中,我像这样配置弹簧:

<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/ThePUname" />

以及网络中的参考.xml

对于单元测试,我这样做:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource" p:persistence-xml-location="classpath*:META-INF/test-persistence.xml"
    p:persistence-unit-name="RealPUName" p:jpaDialect-ref="jpaDialect"
    p:jpaVendorAdapter-ref="jpaVendorAdapter" p:loadTimeWeaver-ref="weaver">
</bean>

推荐