Hibernte EntityManager不会保留

时间:2015-12-15 04:21:15

标签: java spring hibernate

我已经阅读了与此相似的帖子,但我似乎无法弄清楚我的问题是什么,所以任何帮助都会非常感激。

我有一个实体对象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()它说没有交易。所以我一定做错了什么,但似乎无法弄明白到底是什么。

3 个答案:

答案 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));