Java Hibernate不在PostgreSQL数据库中进行更改

Java Hibernate不在PostgreSQL数据库中进行更改,java,hibernate,postgresql,Java,Hibernate,Postgresql,我对Hibernate有一个奇怪的问题。我可以从数据库中选择一些内容,但不能插入或更新任何值。以下是我的配置和示例代码persistence.xml: <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:

我对Hibernate有一个奇怪的问题。我可以从数据库中选择一些内容,但不能插入或更新任何值。以下是我的配置和示例代码persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
    version="1.0">
    <persistence-unit name="UserDS">

        <class>****User</class>
        <properties>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/test"/>
            <property name="hibernate.connection.username" value="myuser"/>
            <property name="hibernate.connection.password" value="mypasword"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="validate" />

        </properties>
    </persistence-unit>
</persistence>
和道:

public class TestDOA{

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

    public String test() {          
        abc ab = (abc) em.createQuery("FROM abc").getResultList().get(0);
        ab.setBb(123);
        em.persist(ab);
        em.flush();
        return ab.getAa() + " " + ab.getBb();
    }
当我使用测试方法时,我得到正确的值。在服务器的日志文件中,我可以看到

[stdout]默认任务7休眠:更新public.abc set bb=?其中aa=


但我的数据库中没有任何更改。问题在哪里

可能事务在任何时候都没有提交。您可以通过检查数据库服务器上的pg_stat_活动来确认这一点-您将看到一个或多个来自应用服务器的连接的事务中条目

您需要决定是使用JTA事务还是显式事务管理

如果您使用的是JavaEE6+JTA,那么您可以。记住,JTA只支持EJB和一些应用服务器CDIBean;@TransactionManagement注释对其他对象没有影响

如果您使用的是Spring+JTA,则需要


如果要直接与持久性提供程序一起使用显式事务管理,则必须开始并提交事务,begin是隐式的,但最好使用em.getTransaction.begin显式编写;和em.getTransaction.commit

可能事务在任何时候都没有提交。您可以通过检查数据库服务器上的pg_stat_活动来确认这一点-您将看到一个或多个来自应用服务器的连接的事务中条目

您需要决定是使用JTA事务还是显式事务管理

如果您使用的是JavaEE6+JTA,那么您可以。记住,JTA只支持EJB和一些应用服务器CDIBean;@TransactionManagement注释对其他对象没有影响

如果您使用的是Spring+JTA,则需要


如果要直接与持久性提供程序一起使用显式事务管理,则必须开始并提交事务,begin是隐式的,但最好使用em.getTransaction.begin显式编写;和em.getTransaction.commit

您忘记了@Transactional问题很可能是您没有提交任何事务。好的,我在测试方法上面添加了@Transactional additionality,但它仍然不起作用。有什么想法吗?我刚刚注意到,在调用em.persist后,事务没有被阻止,我不能在pgadmin中调用update语句。我必须重新启动WildFly服务器才能解锁事务。我不知道…@Hannes,只有在他们使用Spring框架的情况下,对吗?你忘了@Transactional问题很可能是你没有提交任何事务。好的,我在测试方法上面添加了@Transactional additionality,但它仍然不起作用。有什么想法吗?我刚刚注意到,在调用em.persist后,事务没有被阻止,我不能在pgadmin中调用update语句。我必须重新启动WildFly服务器才能解锁事务。我不知道…@Hannes,除非他们使用的是Spring框架,对吗?
public class TestDOA{

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

    public String test() {          
        abc ab = (abc) em.createQuery("FROM abc").getResultList().get(0);
        ab.setBb(123);
        em.persist(ab);
        em.flush();
        return ab.getAa() + " " + ab.getBb();
    }