Java Hibernate不在PostgreSQL数据库中进行更改
我对Hibernate有一个奇怪的问题。我可以从数据库中选择一些内容,但不能插入或更新任何值。以下是我的配置和示例代码persistence.xml: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:
<?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();
}