Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 合并现有Hibernate模型对象时不支持操作异常?_Java_Hibernate_List_H2 - Fatal编程技术网

Java 合并现有Hibernate模型对象时不支持操作异常?

Java 合并现有Hibernate模型对象时不支持操作异常?,java,hibernate,list,h2,Java,Hibernate,List,H2,在从Hibernate3升级到4之后,我们正在处理一些突然出现的问题。让我们特别困惑的是一个不支持的操作异常,在这个异常中,一个现有的对象被从数据库中提取、调整和合并 问题是Hibernate似乎在向抽象列表添加对象 当保存在DAO中时,这似乎只发生在一种特定的对象类型上,但最好是: 我们没有使用任何会导致创建不可变实例的sublist()或asList()方法 检查正在保存的对象(它很大,有很多子项),我认为它的任何子项都不是AbstractList类型 以下是围绕堆栈点的代码片段: Hibe

在从Hibernate3升级到4之后,我们正在处理一些突然出现的问题。让我们特别困惑的是一个不支持的操作异常,在这个异常中,一个现有的对象被从数据库中提取、调整和合并

问题是Hibernate似乎在向
抽象列表添加对象

当保存在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)