Java 合并现有Hibernate模型对象时不支持操作异常?
在从Hibernate3升级到4之后,我们正在处理一些突然出现的问题。让我们特别困惑的是一个不支持的操作异常,在这个异常中,一个现有的对象被从数据库中提取、调整和合并 问题是Hibernate似乎在向Java 合并现有Hibernate模型对象时不支持操作异常?,java,hibernate,list,h2,Java,Hibernate,List,H2,在从Hibernate3升级到4之后,我们正在处理一些突然出现的问题。让我们特别困惑的是一个不支持的操作异常,在这个异常中,一个现有的对象被从数据库中提取、调整和合并 问题是Hibernate似乎在向抽象列表添加对象 当保存在DAO中时,这似乎只发生在一种特定的对象类型上,但最好是: 我们没有使用任何会导致创建不可变实例的sublist()或asList()方法 检查正在保存的对象(它很大,有很多子项),我认为它的任何子项都不是AbstractList类型 以下是围绕堆栈点的代码片段: Hibe
抽象列表添加对象
当保存在DAO中时,这似乎只发生在一种特定的对象类型上,但最好是:
我们没有使用任何会导致创建不可变实例的sublist()或asList()方法
检查正在保存的对象(它很大,有很多子项),我认为它的任何子项都不是AbstractList
类型
以下是围绕堆栈点的代码片段:
HibernateDao.save():
@Transactional
public void save(T item) {
try {
getSessionFactory().getCurrentSession().merge(item);
} catch (Exception ex) {
LOGGER.debug("Unable to merge", ex);
LOGGER.warn("Unable to merge item, saving instead. (Of type " + item.getClass() + ")");
getSessionFactory().getCurrentSession().saveOrUpdate(item);
}
}
我们正在保存的用户项有许多子项,定义如下:
@OneToMany(cascade = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private Map<String, Project> associatedProjects = new HashMap<String, Project>();
我们不确定抽象列表来自何处,或者我们如何负责。使用Hibernate 4时是否存在任何可能导致部分不可修改对象的潜在缺陷(此问题自升级以来是新问题)?或者这会导致Hibernate的行为导致它试图创建不可修改的对象实例?在这段代码中:
@OneToMany(cascade=CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private Map associatedProjects=new HashMap();
再加上这个怎么样
@OneToMany(cascade=CascadeType.ALL)
*****@JoinColumn(name=”“)****
@LazyCollection(LazyCollectionOption.FALSE)
private Map associatedProjects=new HashMap();
我遇到了同样的问题(使用集合而不是列表),而且似乎Hibernate的持久化变体试图委托给一个抽象基类,而该基类没有实现添加
方法。我找到的解决方案是将数据成员设置为null,进行合并
,然后将数据成员设置回我希望它包含的新列表。比较明显的缺点是,即使我只想添加或删除一条记录,我也会将所有记录吹走。好的一面是它实际上是有效的…使用此交易类型:
@javax.transaction.Transactional(Transactional.TxType.REQUIRES_NEW)
从stacktrace中,听起来好像合并正在级联到与用户关联的其他对象。你们有任何集合映射为包类型吗?对我来说,这看起来像是hibernate中的一个错误,这会使绕过这个问题变得很难看。我认为唯一的机会是,找出这个项目的哪个孩子或孙子产生这个错误。对于测试,您可以手动合并item
的子项(可能还有孙子项),而不是级联到该项。@mattb我们绝对没有任何包类型-只有HashMap和ArrayList。在Hibernate合并对象之前检查该对象,似乎Hibernate实际上将许多ArrayList类型包装在一个PersistentBag中。(但是,包下面是实际的具体ArrayList实现,所以我认为这不是问题。)@Johanna谢谢-我将在调试器中再次检查该对象,看看是否可以确定哪个子对象导致了问题。您可能现在已经知道了,但对于未来的读者,当您在没有指定@Order的情况下持久化列表时,Hibernate会将其视为一个包。AbstractList来自PersistentBag中使用的支持列表。
@javax.transaction.Transactional(Transactional.TxType.REQUIRES_NEW)