我有一个简单的一对一关系:
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 unsaved mike.Person.vehicle -> mike.Vehicle; nested exception is java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : mike.Person.vehicle -> mike.Vehicle
我尝试以两种顺序保存实体:
personDao.save(person);
vehicleDao.save(vehicle);
和
vehicleDao.save(vehicle);
personDao.save(person);
我也有同样的例外。
我能够解决这个问题:
问题是,是否有更好的解决方案?也许我做错了什么?
以下是(琐碎的)实体和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);
}
}
嗯,我只是面临着同样的问题,所以想分享我是如何处理例外的。在耐心地浏览了我的jsp之后,我意识到我犯了一个粗心的错误:我没有像下面的代码片段中所示的那样将path属性设置为“BioData.address.lga.lgaId”,而是粗心地将其设置为“BioData.address.lga.lgaName”作为lgaId的主键没有映射到lga对象,因此无法将键映射到对象。
<form:select path="bioData.address.lga.lgaId" id="title" required="required" class="form-control col-md-7 col-xs-12">
<c:forEach items="${lgaList}" var="lga">
<form:option value="${lga.lgaId }"><c:out value="${lga.name}"/></form:option>
</c:forEach>
</form:select>
下面的代码是错误的代码:
<form:select path="bioData.address.lga.lgaName" id="title" required="required" class="form-control col-md-7 col-xs-12">
<c:forEach items="${lgaList}" var="lga">
<form:option value="${lga.lgaId }"><c:out value="${lga.name}"/></form:option>
</c:forEach>
</form:select>
它现在运转良好。
可以在单个事务中使用级联或持久化这两个实体:
@Transactional
void savePersonVehiclePair(Person person, Vehicle vehicle){
personDao.save(person);
vehicleDao.save(vehicle);
}
我犯了这个错误,这是一个很大的头疼,直到我弄明白了原因。。就像上面说的
object references an unsaved transient instance // Read it again
实际原因是,您的对象——这里的外键映射对象指的是一个值,该值在保存主键的表的主键字段中不可用(在执行dao操作时在表中不可用)。所以,在对持有外键的模型类执行操作之前,必须先对主键表执行操作。。
如果你被上面的段落弄糊涂了,我会把它变得简短而甜蜜
外键引用的值在主键字段中不可用
请通过以下方式尝试sysout
外键的值:
System.out.println(modelClassObject.getForeignKeyGetter().getId());
我确信它将返回0或外键引用的主键字段中不可用的值。
我有一个数据库,有两个表Batchstatistics和ReconProcessDateTracker。我想了解他们之间的关系。我使用以下模型类使用hibernate实现这一点: } } 当我试图保存它时,我得到的错误对象引用了一个未保存的瞬态实例——在刷新之前保存瞬态实例:com。美国药典。实体TBLBatch统计
我有两个例子。一个是项目,一个是模块。< code >一对多关系。 我将模块设置到项目中。然后使用。第一次,因为数据库中没有记录,所以项目和模块可以保存到数据库中。然而,第二次,因为我不需要创建新项目,我只创建新模块,然后将模块设置回项目。 发生异常。 对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。 有什么办法可以解决这个问题吗谢谢
上图显示了表之间的关系。 AddressType表包含静态值,如mailing、home、work等。 在AddressTypeRel模型类中,我有一个带有多对一注释的AddressType对象
对于我的问题,我遇到了一些可能的好答案,但这是关于从Hibernate3.4.0ga升级到Hibernate4.1.8的。所以这在以前的版本下是可行的,我已经搜索了上上下下为什么它在这个新版本中被打破了。 我得到一个 这是我的课。
受雇的 Emploadable
问题内容: 我已经为我的问题找到了一些很好的答案,但这是关于从Hibernate 3.4.0GA升级到Hibernate 4.1.8的问题。因此,这在以前的版本中一直有效,我一直在高低搜寻其在新版本中的重要性。 我得到一个 org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例- 在刷新之前保存该瞬态实例:com.test.server.dom