1

我正在使用 Spring+Hibernate+MS SQL 开发一个 Web 应用程序并遇到一个奇怪的症状:

我的父对象A有一个字段引用 ( FK) 另一个子对象B。在A,我有注释

@ManyToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)

当我Session.SaveOrUpdate呼吁A。一切正常,B并且除了一种情况外也保持不变:

id field表 B 的(这是主键)为 0 时,它会给出异常:

对象引用了一个未保存的瞬态实例...

如果它不为零,那么一切都很好。

正如大多数人对异常“对象引用未保存的瞬态实例......”所建议的那样,我也尝试将注释更改为

@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER). 

然后它给了我另一个错误说Primary key cannot be NULL......

有人对这个问题有任何意见或解释吗?非常感谢您的帮助!!

4

1 回答 1

0

谢谢你的回复,肯。我将 A 映射如下:

@Entity
@Table(name="TableA")
public class TableA implements Serializable {
.....
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch=FetchType.EAGER)
@JoinColumn(name="B_id")
public TableB  getB_id() {      
    return this.b_id;
}
public void setB_id(TableB  p) {        
    this.b_id= p;
}
...
}

和 B 如下:

Entity
@Table(name="TableB")
public class TableB implements Serializable {
private int B_id;
private String B_name;
private String B_desc;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="B_id")    
public int getB_id()
{
    return this.B_id;
}
public void setB_id(int id)
{
    this.B_id = id;
}

@Column(name="B_name")
public String B_name()
{
    return this.B_name;
}
}

在调用 session.SaveOrUpdate(a) 之前,我有:

TableA tempA = aDao.getA(id); 
TableB tempB =bDao.getB(0);
tempA.setB_id(tempB);
session.SaveOrUpdate(tempA);
于 2012-10-11T18:04:02.287 回答