我正在尝试设置一个Spring JPA Hibernate简单示例WAR来部署到Glassfish。 我看到一些示例使用persistence.xml文件,而其他示例则没有。 一些示例使用dataSource,而另一些示例则不使用。到目前为止,我的理解是,如果我有:
,则不需要dataSource<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注入。
我的applicationContext.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>
我的EntityManager类:
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";
}
我的web.xml:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
是否有任何我错过的部分让Spring将“em”注入StudentService?
答案 0 :(得分:13)
虽然你可能做过确认......
您是否包含
<!-- 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" />
应用程序context.xml中的位?
此外,我不确定您是否可以使用这种设置的jta交易类型?这不需要数据源托管连接池吗?所以请尝试使用RESOURCE_LOCAL。
答案 1 :(得分:4)
我很困惑。您是将PU注入服务层而不是持久层?我不明白。
我将持久层注入服务层。服务层包含业务逻辑并划分事务边界。它可以在事务中包含多个DAO。
我也没有在你的save()方法中获得魔力。如何保存数据?
在制作中我按照以下方式配置弹簧:
<jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/ThePUname" />
以及web.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>
答案 2 :(得分:1)
如果有人想使用纯粹 Java配置而不是xml
配置hibernate,请使用:
您可以在Spring中配置Hibernate而不使用persistence.xml,如下所示:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
Map<String, Object> properties = new Hashtable<>();
properties.put("javax.persistence.schema-generation.database.action",
"none");
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect"); //you can change this if you have a different DB
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(adapter);
factory.setDataSource(this.springJpaDataSource());
factory.setPackagesToScan("package name");
factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
factory.setValidationMode(ValidationMode.NONE);
factory.setJpaPropertyMap(properties);
return factory;
}
由于您没有使用persistence.xml,您应该创建一个返回DataSource的bean,您可以在上面设置数据源的方法中指定它:
@Bean
public DataSource springJpaDataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl("jdbc:mysql://localhost/SpringJpa");
dataSource.setUsername("tomcatUser");
dataSource.setPassword("password1234");
return dataSource;
}
然后在此配置文件上使用@EnableTransactionManagement
注释。现在当你放置那个注释时,你必须创建一个最后一个bean:
@Bean
public PlatformTransactionManager jpaTransactionManager()
{
return new JpaTransactionManager(
this.entityManagerFactoryBean().getObject());
}
现在,不要忘记对那些处理DB的方法使用@Transactional
注释。
最后,不要忘记在您的存储库中注入EntityManager
(此存储库类应该对其进行@Repository
注释)。
答案 3 :(得分:0)
我使用JPA / Hibernate&amp; amp;设置了一个测试应用程序。 Spring,我的配置镜像你的,除了我创建数据源并将其注入EntityManagerFactory,并将数据源特定属性移出persistenceUnit并移入数据源。通过这两个小的改动,我的EM被正确注入。
答案 4 :(得分:0)
这可能很旧,但是如果有人遇到同样的问题,请尝试在PersistenceContext注释中将unitname更改为name:
这
@PersistenceContext(unitName="educationPU")
到
@PersistenceContext(name="educationPU")