1.当 IDENTITY_INSERT 设置为 OFF 时,不能向表 xxx 中的标识列插入显式值
这是有Hibernate的递增标示搞出来的问题,需要设置entityBean的自增标示
不同的数据库可能需要的标示是一样的
mssql2000 为例:
@Entity
@Name("student")
@Table("Student")
@Scope(ScopeType.SESSION)
public class Student{
@Id
@Column(name = "StudentId", unique = true, nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
@NotNull
public int getStudentId() {
return this.studentId;
}
public void setStudentId(int studentId) {
this.studentId = studentId;
}
}
2.object references an unsaved transient instance - save the transient instance before flushing
这个例外是在保存一个对象的时候,原因是这条对象应用了另外的一个对象,而引用的那个对象不存在,
解决这个问题当然是要先维护设置它们的关系,然后在保存这个对象,当然,通过设置
他们的级联保持参数也可以.
cascade的值只能从CascadeType.PERSIST(级联新建),CascadeType.REMOVE(级联删除),
CascadeType.REFRESH(级联刷新),CascadeType.MERGE(级联更新)中选择一个或多个。
还有一个选择是使用CascadeType.ALL,表示选择全部四项,
出现这个错误可以配置CascadeType来解决问题,不过还要看是在什么情况下处的错误,如果是在更新一个对象的时候
出现错误,可以设置CascadeType.MERGE或者CascadeType.ALL,然后调用EntityManager的merge方法。如果是在新添加
一个对象的时候出现的错误,那么就可能是被引用的那个对象确实不存在,需要先保存它。如果你确定被引用的那个对象
在数据库中已经存在,那么可能是它已经脱离EntityManager的管理,先把它重新查出来,就可以了,这时候CascadeType
可以为任何参数四个参数中的任何一个或者它们的任意组合。当然,在更新一个对象的时候也可能是由于被引用那个对象
已经不在EntityManager的管理范围内,也可以通过重新加载的方式解决问题。
3.org.hibernate.PersistentObjectException: detached entity passed to persist
在网上找到了可能导致这个Exception的四种原因
a. @Id标注的BEAN类属性是自动生成的,而添加的时候却设置了属性 解决方法:把SET()方法去掉
b. @Id标注的位置错误 解决方法:修改位置
c. @Id标注的属性类型错误 解决方法:修改类型
d. 多对一关联时级联关系设为CascadeType.ALL或 CascadeType.PERSIST 解决方法:修改级联关系,
不应有 persist
我是在修改的时候遇到到这个问题,在添加的时候一切运行正常,
显然以上四种解决方法都不能满足我的需要,呵呵,不过我找到第五种方法,那就是在修改的时候
e. 用EntityManager的merge方法。
@In
prvate EntityManager entityManager;
public void update(Student student){
entityManager.merge(student);
}