0

我有一个相对复杂的实体。像这样的东西:

@Entity
public class MyEntity {

/// some fields
///...

@OneToMany(/*cascade = CascadeType.ALL, */fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@Cascade({CascadeType.ALL})
protected Set<ParameterValue> parameterValues 

//...
}

@Entity
public class ParameterValue {

// ...
 @ManyToOne(fetch = FetchType.EAGER)
 @Cascade({org.hibernate.annotations.CascadeType.MERGE,     org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.REFRESH})
 private Parameter  parameter

}

MyEntity 具有 String id,ParameterValue 已生成 long Id 并且 Parameter 具有 string id

我的实体具有参数值,每个参数值都有参数,该参数在来自不同实体的其他参数值之间共享

参数是具有不同实现的抽象类

我的问题是,当我为此类对象调用休眠会话 saveOrUpdate 1)它非常慢 2)有时我收到 org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话相关联:[com.xxx。 entity.content.EnumParameter#-1672482954]

保存/更新此类实体的正确方法是什么?

我从以前的开发人员那里继承了架构,所以如果需要简化保存,我可以更改它

4

1 回答 1

1

好吧,转换到long数据库中正确的主键(唯一、索引)的唯一 ID 可以显着加快更新速度。

根据您要更新的内容,摆脱 Eager fetch 是另一种加快速度的方法 - 也许您只需要更新ParamValue一些MyEntity?仅检索它ParamValue并在修改后存储它(select p from ParamValue p where p.entity=:entity)。

这实际上取决于您的代码实际执行的操作,但是这两件事(延迟加载和正确的唯一键)会加快速度 - 尽管延迟加载可能需要查看一些代码。

于 2013-11-12T14:31:43.463 回答