gpt4 book ai didi

java - Hibernate 不对 PostgreSQL 数据库进行更改

转载 作者:行者123 更新时间:2023-11-29 12:37:38 27 4
gpt4 key购买 nike

我对 Hibernate 有一个奇怪的问题。我可以从数据库中选择一些东西,但我不能插入或更新任何值。这是我的配置和示例代码,persistance.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>

实体:

@Entity
@Table(name = "abc", schema = "public")
public class Abc {

@Id
private String aa;

private Integer bb;

public String getAa() {
return aa;
}

public void setAa(String aa) {
this.aa = aa;
}

public Integer getBb() {
return bb;
}

public void setBb(Integer bb) {
this.bb = bb;
}
}

和 DAO:

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)Hibernate:更新 public.abc set bb=?其中 aa=?

但是我的数据库没有变化。哪里有问题 ?

最佳答案

大概事务在任何时候都没有被提交。您可以通过检查 pg_stat_activity 来确认这一点在数据库服务器上 - 你会看到一个或多个 <IDLE> in transaction来自您的应用服务器的连接条目。

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

如果您使用的是 Java EE 6 + JTA,您 need to add appropriate annotations .请记住,JTA 仅支持 EJB 和(在某些应用程序服务器中)CDI bean;一个@TransactionManagement注释静静地对其他对象没有影响。

如果您使用的是 Spring + JTA,则需要 look up the docs for the @Transactional annotation and the rules around it instead .

如果您打算直接使用持久性提供者使用显式事务管理,您必须使用 em.getTransaction().begin(); 开始并提交事务(开始是隐式的,但最好显式编写)。和 em.getTransaction().commit();

关于java - Hibernate 不对 PostgreSQL 数据库进行更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24598048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com