gpt4 book ai didi

java - "object references an unsaved transient instance"双向一对一

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:44:27 26 4
gpt4 key购买 nike

我有一个简单的一对一关系:

  • 每个实体的独立 DAO。
  • 事务由 Spring 管理。
 PersonDao personDao = ctx.getBean(PersonDao.class, "personDaoImpl");
VehicleDao vehicleDao = ctx.getBean(VehicleDao.class, "vehicleDaoImpl");

Vehicle vehicle = new Vehicle("Audi");
Person person = new Person("Mike");

vehicle.setPerson(person);
person.setVehicle(vehicle);

personDao.save(person);
vehicleDao.save(vehicle);

每当我运行该应用程序时,我都会收到以下异常:

Exception in thread "main"org.springframework.dao.InvalidDataAccessApiUsageException:org.hibernate.TransientPropertyValueException: object references an unsavedmike.Person.vehicle -> mike.Vehicle; nested exception isjava.lang.IllegalStateException: org.hibernate.TransientPropertyValueException:object references an unsaved transient instance - save the transient instancebefore flushing : mike.Person.vehicle -> mike.Vehicle

I tried saving the entities in both orders:

personDao.save(person);
vehicleDao.save(vehicle);

vehicleDao.save(vehicle);
personDao.save(person);

我得到了同样的异常。

我能够通过以下方式解决这个问题:

  1. 使用级联。
  2. 我想 OpenSessionInView 也可以。

问题是有没有更好的解决办法?也许我在做一些根本性的错误?


以下是(琐碎的)实体和 DAO:

@Entity
public class Person {
@Id @GeneratedValue
private int id;
private String name;
@OneToOne
private Vehicle vehicle;

/* getters, setters, constructors */
}

--

@Entity
public class Vehicle {
@Id @GeneratedValue
private int id;
private String name;
@OneToOne
private Person person;

/* getters, setters, constructors */
}

--

@Repository
public class PersonDaoImpl implements PersonDao {

@PersistenceContext
private EntityManager em;

@Transactional
public void save(Person p) {
em.persist(p);
}
}

--

@Repository
public class VehicleDaoImpl implements VehicleDao {

@PersistenceContext
private EntityManager em;

@Transactional
public void save(Vehicle v) {
em.persist(v);
}
}

最佳答案

我遇到了这个错误,这让我很头疼,直到我弄清楚原因......就像它说的那样

object references an unsaved transient instance   // Read it again

实际原因,您的对象 - 这里的外键映射对象指的是一个值,该值在保存主键的表的主键字段中不可用(在执行 dao 操作时在表中不可用)。所以你必须在对持有外键的模型类执行操作之前对主键表执行操作..

如果你对上面的段落感到困惑,那么我会把它写得简短而亲切

您的外键引用的值在主键字段中不可用

尝试sysout外键的值

System.out.println(modelClassObject.getForeignKeyGetter().getId());

我确定它会返回 0 或外键引用的主键字段中不可用的值。

关于java - "object references an unsaved transient instance"双向一对一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28386709/

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