我有一个相对复杂的实体。像这样:
@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生成了长Id,参数具有字符串id
我的实体有参数值,每个参数值都有参数,在不同实体的其他参数值中共享
参数是具有不同实现的抽象类
我的问题是,当我为这些对象调用hibernate session saveOrUpdate时 1)它很慢 2)有时我收到org.hibernate.NonUniqueObjectException:具有相同标识符值的另一个对象已经与会话关联:[com.xxx.entities.content.EnumParameter#-1672482954]
保存/更新此类实体的正确方法是什么?
我继承了之前开发人员的架构,因此如果需要简化保存,我可以更改它
答案 0 :(得分:1)
好吧,转换为数据库中正确主键(唯一,索引)的long
唯一ID可以显着加快更新速度。
取决于您正在更新的内容,摆脱急切获取是另一种加快速度的方法 - 也许您只需要在某些ParamValue
中更新一些MyEntity
?仅检索ParamValue
并在修改后存储它(select p from ParamValue p where p.entity=:entity
)。
这实际上取决于你的代码实际上做了什么,但是这两件事(延迟加载和正确的唯一键)会加快速度 - 尽管延迟加载可能需要查看一些代码。