Java 在Hibernate级联保存期间,如何确保内部对象的条件更新

Java 在Hibernate级联保存期间,如何确保内部对象的条件更新,java,hibernate,conditional,cascade,Java,Hibernate,Conditional,Cascade,我需要使用Hibernate保存一个新创建的MainObject类型的对象。我向它添加了两个新创建的对象child1和child2,因为它们不在数据库中。 假设child3和child4已经出现在DB中。但是,我可能不喜欢从DB加载整个对象并将它们添加到MainObject,因为这些对象可能有太多不需要的属性。 因此,我只需获取这两个对象的DB键,并将这些键添加到新实例化的ChildObject3和ChildObject4对象(这两个对象的所有其他字段都将为null)。我将这些对象添加到Main

我需要使用Hibernate保存一个新创建的MainObject类型的对象。我向它添加了两个新创建的对象child1和child2,因为它们不在数据库中。 假设child3和child4已经出现在DB中。但是,我可能不喜欢从DB加载整个对象并将它们添加到MainObject,因为这些对象可能有太多不需要的属性。
因此,我只需获取这两个对象的DB键,并将这些键添加到新实例化的ChildObject3和ChildObject4对象(这两个对象的所有其他字段都将为null)。我将这些对象添加到MainObject

现在,如果我尝试以级联模式保存MainObject,ChildObject3和ChildObject4也将在DB中使用所有空值进行更新,这是我不希望看到的。我想要的是一种级联方式,通过这种方式,只有非持久化对象才会保存到DB(在本例中为ChildObject1和ChildObject2)。持有DB密钥的其他对象不会被更新,只用于保存MainObject

我知道级联不能以这种方式工作。有没有其他方法可以做到这一点,比如刷新整个对象层次结构,以便ChildObject3和ChildObject4从DB中刷新,然后我可以以级联模式保存Main对象?或者我可以在callout方法中设置某些条件,通过检查对象是否持有DB键来确定是否更新对象

我觉得这是一个必要的手术。无论何时保存新对象,我们可能并不总是希望加载所有内部对象的所有属性,只是为了能够以级联模式保存主对象。我们只需要DB主键,可能不希望通过加载所有内部对象的所有字段来强调内存


请推荐任何好的解决方案或最佳做法。

“因此,我只需获取这两个对象的DB键,并将这些键添加到新实例化的ChildObject3和ChildObject4对象(其他所有字段均为空)。我将这些对象添加到MainObject。”您如何做到这一点?从“对象”视图中,您只能使用对象,不能使用关键点。如果延迟加载父对象,则在访问子对象之前不应加载它们。问题不会出现。如果-出于某种原因-您确实已经有了密钥,您可以使用session.get()/entityManager.getReference()手动创建代理对象。使用sql查询获取DB密钥,因为其中一些对象有25个以上的字段。get函数必须有选择地应用于每个持久性对象(避免非持久性的新对象)。寻找一个可以从层次结构的顶部到底部层叠(要保存)的函数,该函数将只刷新持久对象而忽略非持久对象,之后我可以在一次调用中保存层次结构。如果只有25个字段,我将急切地获取它们。获取的列数对查询的运行时几乎没有性能影响。运行时几乎完全由返回结果所需的行数决定。获取具有如此多字段的多个对象可能会消耗RAM中的大量空间,如果仅获取DB密钥就可以避免这种情况,那就没有了。我不知道您在字段中存储了什么,但如果每个字段平均为10个字节,并且您有20个子对象,则比我们所说的5kB要多。如果你担心这个内存,你就不应该使用JPA,因为相比之下它的占用空间是巨大的。“所以我只需要获取这两个对象的DB键,然后将这些键添加到新实例化的ChildObject3和ChildObject4对象(这两个对象的所有其他字段都为null)。我将这些对象添加到MainObject。”你会怎么做?从“对象”视图中,您只能使用对象,不能使用关键点。如果延迟加载父对象,则在访问子对象之前不应加载它们。问题不会出现。如果-出于某种原因-您确实已经有了密钥,您可以使用session.get()/entityManager.getReference()手动创建代理对象。使用sql查询获取DB密钥,因为其中一些对象有25个以上的字段。get函数必须有选择地应用于每个持久性对象(避免非持久性的新对象)。寻找一个可以从层次结构的顶部到底部层叠(要保存)的函数,该函数将只刷新持久对象而忽略非持久对象,之后我可以在一次调用中保存层次结构。如果只有25个字段,我将急切地获取它们。获取的列数对查询的运行时几乎没有性能影响。运行时几乎完全由返回结果所需的行数决定。获取具有如此多字段的多个对象可能会消耗RAM中的大量空间,如果仅获取DB密钥就可以避免这种情况,那就没有了。我不知道您在字段中存储了什么,但如果每个字段平均为10个字节,并且您有20个子对象,则比我们所说的5kB要多。如果你担心这个内存,你就不应该使用JPA,因为相比之下它的内存占用是巨大的。
Consider the following class:
Class MainObject {
    ....
    ChildObject1 child1;
    ChildObject2 child2;
    ChildObject3 child3;
    ChildObject4 child4;
}