【问题标题】:org.hibernate.TransientObjectException:Hibernateorg.hibernate.TransientObjectException:休眠
【发布时间】:2013-01-25 07:06:47
【问题描述】:

我对 Hibernate 非常陌生,在这里我遇到了一个瞬态异常。请帮忙。

保存对象时发生异常Location 对象引用了一个未保存的--transient 实例 - 在刷新之前保存瞬态实例:<City object>; nested exception is org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

当我尝试将数据保存到我的位置表中时,我遇到了异常,该位置表有一个 City 对象,其所有元素都指向 null。

Location object       
   private String LocationAddress;  
   @ManyToOne
   @JoinColumn(name = "CITYID")
   private City city;


City
   private String cityName;
   private int cityId;

在位置表中CityID 是可为空的字段,因为city 不是必填字段。我们有一个城市表,它是一个静态表,所以我们不想在城市表中插入数据。 现在当我们存储 Location 对象时。如果 City 对象具有某些值(例如某个城市),则它可以很好地存储数据。但是当对象包含空白对象时抛出异常(cityName 和cityId 为空)

请帮忙。

示例场景

Successful
      Location 
       locationAddress = "test Address"
        city 
           cityId="1"
           cityName="testCity"

Failure
      Location 
           locationAddress = "test Address"
           city 
               cityId=null
               cityName=null

【问题讨论】:

标签: java hibernate


【解决方案1】:

没有看到你的代码很难确定,但听起来你在保存Location 类之前没有保存City。您有两个持久化选项:

您可以使用@Cascade 注释将插入从父级级联到子级。这样做,你可以坚持 Location 类,Hibernate 会处理剩下的事情。

@ManyToOne
@JoinColumn(name = "CITYID")
@Cascade(CascadeType.PERSIST)  //Or ALL if you want Updates, Deletes to go to
private City city;

更多关于@Cascadehere。

如果您不想这样做,则需要在保存 Location 之前显式保留 City 类。

【讨论】:

  • 抱歉,我错过了有关您尝试在何处存储具有空标识符的 City 类的部分。 @Yair 是对的,您需要将 city 设置为 null。如果您不想以编程方式执行此操作,您可以在 Location 中的方法上使用 @PrePersist 注释,例如:@PrePersist public void prePersist() { if(city.cityId == null) city = null; }。然后它应该保存,只要 city_id 列在 Location 表中,Hibernate 将在再次加载该对象时忽略它。
【解决方案2】:

如果您尝试保存实际引用no City 的Location 实例,那么您应该让Location.City 引用null,而不是创建City字段为null 的实例。

(字段为null 的City 实例被Hibernate 视为您想要cities 表中的新记录,其中列值为null - 这没有多大意义)

【讨论】:

  • @ yair,City 对象有时有价值,有时没有,这是由 JSF bean 管理的,所以我无法将其设为 null,除非我放了一个 if 检查.....但是制作它为空也没有解决问题......当我让它为空时,休眠开始寻找城市对象。
  • @user1422423 如果Location.City 是null,Hibernate 没有要查找的对象...除非您在保存时正在做一些特殊的事情。您能说明如何保存Location 对象吗?
猜你喜欢
  • 2011-07-13
  • 2011-12-16
  • 2021-10-21
  • 2015-02-08
  • 2019-04-18
  • 2017-02-06
  • 2017-05-18
  • 2017-09-19
  • 2013-10-19
相关资源
最近更新 更多