Java Hibernte EntityManager不';不坚持

Java Hibernte EntityManager不';不坚持,java,spring,hibernate,Java,Spring,Hibernate,我读过类似的帖子,但我似乎不知道我的问题出在哪里,所以如果有任何帮助,我将不胜感激 我有一个实体对象Xyz 这是我的刀课: @Repository public class XyzDAO { @PersistenceContext(name = "MyEntityManager") private EntityManager em; @Transactional public void create(Xyz xyz) { em.persist(x

我读过类似的帖子,但我似乎不知道我的问题出在哪里,所以如果有任何帮助,我将不胜感激

我有一个实体对象
Xyz

这是我的刀课:

@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>
<?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>

org.hibernate.ejb.HibernatePersistence
…Xyz
xyz-config.xml:

<beans .....>
    <tx:annotation-driven transaction-manager="transactionManager" />
    <bean id="XyzDAO" class=".....XyzDAO"></bean>
</beans>

从DB中读取Xyz可以很好地工作,但是如果我尝试持久化Xyz,它会运行而不会出错,但不会将任何内容保存到DB中,因此我的假设是没有创建事务。如果我执行
em.getTransaction().begin()
操作,则会给出
不允许在共享EntityManager上创建事务的消息-请改用Spring事务或EJB CMT
错误。如果我执行
em.flush()
,则表示没有事务。所以我一定是做错了什么,但似乎不知道到底是什么。

  • EntityManager
    是从实体管理器工厂获得的对象。 您应该将持久性单元MyEntityManager注入到
    EntityManager工厂
    对象引用中,并使用它获取
    EntityManager
    的实例

     @PersistenceUnit(unitName = "MyEntityManager")
     private EntityManagerFactory entityManagerFactory;
    
     .....
    
     @Transactional
     public void create(Xyz xyz) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        entityManager.persist(xyz);
     }
    
     .....
    

也请检查。

好的,我不确定回答我自己的问题是否是个好主意,但基本上,由于某种原因,RESOURCE\u LOCAL无法工作,因此我不得不切换到JTA。所以,持久性现在可以工作了,文件如下所示:

道:

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>
<?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>

org.hibernate.ejb.HibernatePersistence
jdbc/datasource/VAP_XA
…Xyz
.....

不对config.xml进行任何更改。希望这对任何人都有帮助,谢谢你的回答。

我在下面遇到了类似的问题,配置帮助我用entitymanager解决了持久化和删除问题

对于删除,请在下面的行中添加:

entityManager.remove(entityManager.contains(user) ? user : entityManager.merge(user));

您是自己管理事务还是通过Spring管理事务,您是否使用注释
@Transactional
,您是如何创建/插入事务管理器的transaction@ankur-singhal我在上面遗漏了什么?你试过我的建议了吗?我也有同样的问题,下面的帖子和下面的配置帮助我解决了持久化和删除问题。