【问题标题】:TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing when I am doing mergeTransientObjectException:对象引用了一个未保存的瞬态实例 - 在我进行合并时在刷新之前保存瞬态实例
【发布时间】:2016-06-08 08:27:38
【问题描述】:

谁能解释我为什么在合并时收到 TransientObjectException。只有当我在 ActivityTestEntity 的构造函数中创建 RuleTestEntitiy 时才会重现问题,如下所示。如果我更新或创建,它不会出现。

提前致谢。

这是一个测试:

@ContextConfiguration(locations = {
    "classpath:testApplicationContext_db.xml"})
public class TransientObjectExceptionTest extends  AbstractTestNGSpringContextTests{
@Autowired
SessionFactory sessionFactory;
@Test
public void testAddTestActivity(){
    Session session = sessionFactory.openSession();
    Transaction tx1 = session.beginTransaction();
    ActivityTestEntity newActivityEntity = new ActivityTestEntity();
    session.merge(newActivityEntity);
    tx1.commit();
    session.close();
    sessionFactory.close();
}

}

例外: org.hibernate.TransientObjectException:对象引用了未保存的瞬态实例 - 在刷新之前保存瞬态实例:com.xxx.RuleTestEntity

@Entity
@Table(name = "ACTIVITY_TEST")
public class ActivityTestEntity implements Serializable{
private static final long serialVersionUID = 4190826330152288861L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ACTIVITY_ID", nullable = false)
private long id;
@OneToMany(mappedBy = "activity", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
private Set<RuleTestEntity> rules = new HashSet<>();
public ActivityTestEntity() {
    RuleTestEntity rule = new RuleTestEntity();
    rule.setActivity(this);
    this.getRules().add(rule);
}
public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
public Set<RuleTestEntity> getRules() {
    return rules;
}
public void setRules(Set<RuleTestEntity> rules) {
    this.rules = rules;
}

}

@Entity
@Table(name = "RULE_TEST")
public class RuleTestEntity implements Serializable {
private static final long serialVersionUID = -4208222848601642508L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "RULE_ID", nullable = false)
@XmlElement(name = Identifiable.ID_FIELD_NAME)
private long id;
@ManyToOne
@JoinColumn(name = "ACTIVITY_ID", nullable = true, updatable = false)
@XmlTransient
private ActivityTestEntity activity;
public ActivityTestEntity getActivity() {
    return activity;
}
public void setActivity(ActivityTestEntity activity) {
    this.activity = activity;
}
public long getId() {
    return id;
}
public void setId(long id) {
    this.id = id;
}
@Override
public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    RuleTestEntity that = (RuleTestEntity) o;
    if (id != that.id) {
        return false;
    }
    return activity != null ? activity.equals(that.activity) : that.activity == null;
}
@Override
public int hashCode() {
    int result = (int) (id ^ (id >>> 32));
    result = 31 * result + (activity != null ? activity.hashCode() : 0);
    return result;
}

}

【问题讨论】:

标签: java hibernate


【解决方案1】:

当您尝试保存引用到未保存实体的实体时会生成此异常。您可以先保存引用的实体,然后再保存实体,也可以将cascade=CascadeType.All 添加到两者之间的关系中。

删除构造函数中的代码,然后尝试以下代码:

    Session session = sessionFactory.openSession();
    Transaction tx1 = session.beginTransaction();
    RuleTestEntity rule = new RuleTestEntity();
    session.save(rule);
    session.refresh(rule);
    ActivityTestEntity newActivityEntity = new ActivityTestEntity();
    Set<RuleTestEntity> rules = new HashSet<>();
    rules.add(rule);
    session.merge(newActivityEntity);
    tx1.commit();
    session.close();
    sessionFactory.close();

【讨论】:

  • 我正在使用 cascade=CascadeType.Al 可以看到,但它没有帮助。
  • 你没有在RuleTestEntity使用它
  • 你能告诉我应该在 RuleTestEntity 的什么地方使用它吗?
  • @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name = "ACTIVITY_ID", nullable = true, updatable = false) @XmlTransient private ActivityTestEntity activity;
  • 向 RuleTestEntity 添加了级联类型,但没有帮助。还是同样的问题。
猜你喜欢
  • 2012-03-21
  • 2012-11-08
  • 2013-01-04
  • 2013-03-24
  • 2016-02-24
  • 2014-10-26
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多