java - hibernate jpa 更新两个字段并仅从一个字段读取

标签 java oracle hibernate jpa hibernate-mapping

针对 java hibernate/jpa 用户的一个简单问题。

我有两个表(实体)A和B,它们之间存在关系,因为A有多个B(一对多)。实体 A 在 java 中有一组值 B。

由于读取性能问题,我想实现主从非规范化,因此我想将原始 Set 对象(可能是序列化的)直接存储在实体 A 中(因为多对一关系由于 jpa 读取而花费了我很多 CPU 时间(更新不是问题))。

问题是,我可以实现类似 getBs 总是返回非规范化对象(因此速度很快)并且 addB 将新 B 添加到 Set 并使用准备更快读取的新原始数据更新非规范化对象吗?

其 Oracle 数据库。

实体示例:

class A {
    Long id,
    String name;
    Set<B> arrayOfBs;
    byte[] denormalizedArrayOfB;

    getArrayOfBs() {
        return (Set<B>) denormalizedArrayOfB;
    }

    addArrayOfBs(B b) {
        //persist b
        // update and persist denormalizedArray with new b
    }
    //getters and setters...
}

class B {
    Long id;
    A reference;
    String x;
    String y;
    //getters and setters...
}

最佳答案

这很复杂。有更好的方法来解决您的问题:

  1. 您可以简单地将一对多关联替换为 DAO 查询。因此,每当您获取父实体时,您将无法获取子集合(也许它们太多了)。但是,当您想要获取父级的子级时,只需运行 DAO 查询,这也更容易过滤。

  2. 您保留子集合,但使用内存缓存来保存完全初始化的对象图。这听起来像是一个自然的选择,但您很可能会 trade consistency for performance .

关于java - hibernate jpa 更新两个字段并仅从一个字段读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27952581/

相关文章:

Java 8 将 String of int 转换为 List<Integer>

oracle - 接收数据库链接名称作为 Oracle PLSQL 中的变量

java - 意外的运行时错误 : Could not load main Class

java - 如何使用java在mysql的枚举类型列中插入两个以上的值?

oracle - SQLERRM被覆盖

.net - 如何使用 .NET 与多个用户一起访问 Oracle 中自己的数据库?

java - 从hibernate拦截器获取实体字段注释

java - 持久化对象在 Hibernate 架构中是什么意思?

java - 无法在数据库更新时更新当前时间戳

java - 如何在 JSF2/EL 2.2 中使用可选参数列表调用方法