【问题标题】:Hibernate Saving complex entity休眠保存复杂实体
【发布时间】:2013-11-12 13:13:12
【问题描述】:

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

@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.entities.content.EnumParameter#-1672482954]

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

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

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

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

    【讨论】:

    • 实际上我有 2 个流程:1. 使用新的 ParameterValues(指向新的或旧的参数)插入新实体 2.将新的 ParameterValues(指向新的或旧的参数)插入现有实体
    • 两者都很慢?还是只有第二个?
    • 两者都很慢,在第一个中我有时会收到 org.hibernate.NonUniqueObjectException:
    • 如果在数据库端生成主键,则将新记录插入数据库应该很快(无需查找任何内容)。检查您的实体对象以拥有本机唯一键 &lt;id name="id" type="long"&gt;&lt;generator class="native"/&gt;&lt;/id&gt;。检查存储对象时执行的实际查询的休眠调试日志 - 应该只有简单的“插入”查询省略 ID 值。
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2013-11-07
    • 2015-01-30
    • 1970-01-01
    • 2017-08-28
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多