【问题标题】:java persistence works with reading from database, silently fails to insert / updatejava持久性适用于从数据库读取,静默无法插入/更新
【发布时间】:2011-10-17 15:35:50
【问题描述】:

我使用 JPA 创建了一个简单的 Java Web (Vaadin) 应用程序项目,它适用于从数据库中读取实体。当我尝试使用persist() 或merge() 时,数据库中没有任何反应。 查看日志时,有 SELECT 查询,但没有 INSERT / UPDATE。

我正在使用定义了 JDBC 资源的 Glassfish 3.1,persistence.xml 来使用该资源 (JTA)。 我使用的是由 Eclipse 自动生成的默认配置文件。

还有另一个类似的项目是别人做的,使用相同的JTA,没有出现这个问题。查看了它的配置,没有发现任何重要的东西。

两个项目都不使用事务。

persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
<persistence-unit name="MapperPersistence">
    <jta-data-source>mapper</jta-data-source>
         <class>pl.bdk.mapper.domain.jpaImpl.MappingImpl</class>
...
         <class>pl.bdk.mapper.domain.jpaImpl.UserImpl</class>
             <properties>
                 <property name="eclipselink.logging.level" value="FINE" />
             </properties>
    </persistence-unit>
</persistence>

Java 代码

public class MappingService {
    public static int createMapping(String clientProductId, User user) {
        MappingImpl mapping = new MappingImpl();
        mapping.setUser(user);
        mappingDao.save(mapping);
        return mapping.getMappingId();
    }
}

...
public class MappingDao {
    public void save(MappingImpl mapping) {
        entityManager.persist(mapping);
    }
}

...
@Entity
@Table("t_mapping")
public class MappingImpl() {
    @Id
    @SequenceGenerator(name="T_MAPPING_MAPPINGID_GENERATOR", sequenceName="S_MAPPING_ID", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="T_MAPPING_MAPPINGID_GENERATOR")
    private Integer id;

    @ManyToOne
    @JoinColumn(name="user_id")
    private User user;

... getters and setters...
}

【问题讨论】:

  • 把代码贴在你认为要插入的地方
  • 您一直在使用事务。如果您没有指定事务的开始和结束点,那么您正在使用一个隐式事务,只有在您在 EntityManager 上调用 close() 时才能保证保持该事务,您这样做了吗?
  • 当您使用 JTA 作为事务资源时,在任何数据库操作之前,您必须打开一个事务,然后根据是否有任何异常尝试提交或回滚相同的事务。如果您至少可以发布persistence.xml,那将很有帮助。
  • @Thor84no:无论有没有close(),效果都是一样的。 flush() 给出异常(因为我没有开始事务)
  • 好的。我不确定它到底是什么,请注意您必须关闭 EntityManager,并且调用 persist() 或 merge() 是对持久层的提示,它没有t 保证它会在 现在 完成,但它应该在某个时候完成,不迟于 close()。

标签: java insert persistence persist


【解决方案1】:

好吧,事情看起来很简单,但事实并非如此。

这篇文章对我帮助很大:Hibernate doesn't save and doesn't throw exceptions?

首先——JPA 需要某种事务机制。通常它是在下面管理的,不需要设置。 这意味着最简单的方法是创建一个 EJB(企业 Java Bean)项目,其中 EntityManager 将被注入@PersistenceContext。如果更喜欢在本地创建 EntityManager(没有 EJB),仍然必须提供一种事务机制。更多信息在上面的帖子中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2018-02-11
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多