我已经阅读了与此相似的帖子,但我似乎无法弄清楚我的问题是什么,所以任何帮助都会非常感激。
我有一个实体对象Xyz
。
这是我的DAO课程:
@Repository
public class XyzDAO {
@PersistenceContext(name = "MyEntityManager")
private EntityManager em;
@Transactional
public void create(Xyz xyz) {
em.persist(xyz);
}
public void setEntityManager(final EntityManager em) {
this.em = em;
}
}
的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="MyEntityManager" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>.....Xyz</class>
<properties>
<property name="hibernate.dialect" value="${hibernate.dialect}" />
<property name="hibernate.connection.driver_class" value="${hibernate.connection.driver_class}" />
<property name="hibernate.connection.url" value="${hibernate.connection.url}" />
<property name="hibernate.connection.username" value="${hibernate.connection.username}" />
<property name="hibernate.connection.password" value="${hibernate.connection.password}" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
XYZ-config.xml中:
<beans .....>
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="XyzDAO" class=".....XyzDAO"></bean>
</beans>
从数据库中读取Xyz工作正常,但是如果我尝试持久化Xyz它运行没有错误但没有任何东西被保存到数据库中,所以我的假设是没有创建事务。如果我em.getTransaction().begin()
,则会出现Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT instead
错误。如果我em.flush()
它说没有交易。所以我一定做错了什么,但似乎无法弄明白到底是什么。
答案 0 :(得分:0)
EntityManager
是从Entity Manager Factory获得的对象。
您应该将持久性单元 MyEntityManager 注入EntityManagerFactory
对象引用,并使用它来获取EntityManager
的实例。
@PersistenceUnit(unitName = "MyEntityManager")
private EntityManagerFactory entityManagerFactory;
.....
@Transactional
public void create(Xyz xyz) {
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.persist(xyz);
}
.....
同时检查this。
答案 1 :(得分:0)
好吧,我不确定回答我自己的问题是不是一个好主意,但基本上由于某种原因,RESOURCE_LOCAL没有用,所以我不得不切换到JTA。因此,持久性现在可以工作,文件看起来像这样:
DAO:
public class XyzDAO {
@PersistenceContext
private EntityManager em;
@Transactional
public void create(Xyz xyz) {
em.persist(xyz);
}
public void setEntityManager(final EntityManager em) {
this.em = em;
}
}
的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" .....>
<persistence-unit name="MyEntityManager" transaction-type="JTA">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>jdbc/datasource/VAP_XA</jta-data-source>
<class>.....Xyz</class>
.....
</persistence-unit>
</persistence>
config.xml没有变化。希望这有助于任何人,并感谢您的答案。
答案 2 :(得分:0)
我在配置下遇到了类似的问题,这帮助我解决了持久性问题并消除了entitymanager的问题。
https://dzone.com/articles/how-does-spring-transactional
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager() {
JpaTransactionManager tm = new JpaTransactionManager();
tm.setEntityManagerFactory(entityManagerFactory());
tm.setDataSource(getHikariDataSource());
return tm;
}
要删除,请添加以下行:
entityManager.remove(entityManager.contains(user) ? user : entityManager.merge(user));