当前位置: 首页 > 知识库问答 >
问题:

IllegalStateException:事务不活动

西门洛城
2023-03-14

java.lang.IllegalStateException:org.hibernate.transientPropertyValueException:object引用了一个未保存的瞬态实例-在刷新之前保存瞬态实例:entity.customer.passport->entity.passport

package entity;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

@Entity
public class Customer {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    @OneToOne(cascade = { CascadeType.MERGE })
    @JoinColumn(name = "passport_id", unique = true)
    private Passport passport;

    public Customer() {
    }

    public Customer(String name, Passport passport) {
        this.setName(name);
        this.passport = passport;
    }

    public Passport getPassport() {
        return passport;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
 package client;

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;

    import entity.Customer;
    import entity.Passport;

    public class OneToOneClient {

        public static void main(String[] args) {
            EntityManagerFactory emf = Persistence
                    .createEntityManagerFactory("jpa-training");
            EntityManager em = emf.createEntityManager();
            EntityTransaction txn = em.getTransaction();
            try {
                em.getTransaction().begin();
                //txn.begin();

                Passport passport = new Passport("99627317");
                Customer customer = new Customer("Customer1", passport);
                em.persist(customer);

                em.getTransaction().commit();
                //txn.commit();
            } catch (Exception e) {
                if (txn != null) {
                    txn.rollback();
                }
                e.printStackTrace();
            } finally {
                if (em != null) {
                    em.close();
                }
            }
        }

    }

注意:如果我在实体类中使用CascadeType.Persist,我可以在DB中插入另一行。

共有1个答案

翟修明
2023-03-14

在客户之前保存passport,您就没事了。替代方案如您所提到的,使用cascade.persist

Hibernate不会在没有被告知的情况下持久化其他实体。

 类似资料:
  • 我有这个类,它致力于通过hibernate的持久层将数据持久化。 问题是它不持久化数据。 堆栈是: 但我必须注意的是,它在其他课堂上效果很好。 更新: 当我打印tx.isActive()时,它给我提供了false。 更新 我试图获取有关错误的更多信息: 我找到了问题所在: 事实上,表tlinkEquipment在同一个表中有2个fk,我保存了TEquipements的数据,然后保存了TEquipe

  • 问题内容: 我有一个专门用于通过hibernate的持久层将数据持久保存在db中的类。 问题在于它不会持久保存数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我印刷它给我的时候。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么

  • 在db会话监视器中,当这种情况发生时,我得到了一个不活动的事务。 我得到的错误如下: 问题是交易和连接应该自动打开和关闭...我希望并发修改失败的事务得到回滚...但似乎他们变得不活跃了。

  • 问题内容: 我有一个专门用于通过休眠的持久层将数据持久保存在db中的类。 问题在于它不保留数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我把它印出来的时候给我。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么引发另一个异常(

  • 问题内容: 我正在尝试使用Spring @Transactional批注,但是在调用方法 findAll 时遇到问题,并且出现以下错误: 人DAO: 这是我的: 我尝试删除此行,但是又出现了一个错误,为什么这行不通? 问题答案: 您必须明确声明对事务管理器注释的支持 添加到您的配置中: tx是xmlns:tx =“ http://www.springframework.org/schema/tx”