Hibernate保存复杂的实体

时间:2013-11-12 13:13:12

标签: java hibernate

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

@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]

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

我继承了之前开发人员的架构,因此如果需要简化保存,我可以更改它

1 个答案:

答案 0 :(得分:1)

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

取决于您正在更新的内容,摆脱急切获取是另一种加快速度的方法 - 也许您只需要在某些ParamValue中更新一些MyEntity?仅检索ParamValue并在修改后存储它(select p from ParamValue p where p.entity=:entity)。

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