【问题标题】:TransientObjectException瞬态对象异常
【发布时间】:2011-09-24 08:54:28
【问题描述】:
Entity
@Table(name = "ADDRESS")
public class Address {

    @Id
    @Column(name = "ID")
    @GeneratedValue
    private int addressid;

    @OneToOne
    @JoinColumn(name = "CITY_ID",nullable = true,insertable=false, updatable=false)
    private City city = new City();

    @OneToOne
    @JoinColumn(name = "DISTRICT_ID",nullable = true,insertable=false, updatable=false)
    private District district = new District();
}

你好, 我有一个名为 Address 的类,我无法使用 DISTRICT_ID = null 将此类保存在休眠状态。

错误是

org.hibernate.TransientObjectException: 对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:form.District

我只是不知道我错过了什么......

【问题讨论】:

  • 请贴出 District 类的代码,或许还有您要保存的代码。它将帮助我们找出问题所在。

标签: hibernate spring


【解决方案1】:

区是否用@Entity注解?
您可能需要在 @OneToOne 上指定 cascade 示例:@OneToOne(cascade={CascadeType.PERSIST})

【讨论】:

  • 是的。 CascadeType.PERSIST 有什么作用?它也没有工作。我想做的是有时将空值分配给区 id。
  • 它保留了 District 实体。您创建一个新的 destrict 实体并将其分配给 Address.district 并保留地址。如果 District 不为空,则它也必须被持久化。这就是您获得异常的原因。如果您级联持久化,则区域也将被持久化。
【解决方案2】:

如果您希望district 成为null,它实际上应该是null 而不是指向新的瞬态实例:

@OneToOne
@JoinColumn(name = "DISTRICT_ID",nullable = true,insertable=false, updatable=false)     
private District district = null;

【讨论】:

  • 不,我不希望它为空 我希望 DISTRICT_ID 为空,它在插入时为空。当它不为空时,它工作正常
  • 我认为问题在于它实际上并未设置为 null。默认情况下,您使用new District() 将其设置为新实例。这很可能永远不会被保存,因此被称为瞬态对象,因为它没有持久化。由于地址引用了这个瞬态对象,因此您不能持久化。
  • @Gary:DISTRICT_ID 基于地区实例的@ID,因此除非它为空,否则 DISTRICT_ID 将始终为非空。此外,由于整数不可为空,您可能需要使用 Integer
【解决方案3】:

如果您想使用 null DISTRICT_ID 保存 District,则不能将其用作主键,因此您不能使用 @Id 对其进行注释。您必须为 District 实体选择不同的 ID。

【讨论】:

    【解决方案4】:

    也许您应该考虑将 city_id 和 city_name 放在同一个对象中,如果您希望 City 和 District 表只读,那么您的城市和地区不会被持久化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-11-22
      • 2017-04-29
      • 1970-01-01
      • 2018-03-25
      相关资源
      最近更新 更多