当前位置: 首页 > 知识库问答 >
问题:

不可变对象的Hibernate组件映射

严劲
2023-03-14

我有一个不可变对象,它是使用组件映射的Hibernate持久化对象的成员。例如,PinDrop对应于一个表,该表的字段类型为immutablePoint

public class PinDrop {
    private String name;
    private Point location;
    // Getters and setters for name and location
}

// Immutable Point
public class Point {
    private final double x;
    private final double y;
    // Getters for x and y, no setters
}

在我的PinDrop中。哈佛商学院。xml

<property name="name" column="name" type="string"/>
<component name="location" class="Point>
    <property name="x" column="location_x" type="double"/>
    <property name="y" column="location_y" type="double"/>
</component>

这不起作用,因为在运行时HiberNate抱怨Point没有xy的设置器。有没有办法使用不可变对象作为HiberNate持久对象的组件?

跟进:我没有使用注释,而是使用hbm。xmlmutableimmutable都不是hbm中组件属性上的有效属性。xml

共有3个答案

松翔
2023-03-14

你试过@Immutable注解吗?

将实体或集合标记为不可变。没有注释意味着元素是可变的。

不可变实体可能不会被应用程序更新。对不可变实体的更新将被忽略,但不会引发异常。@不可变只能在根实体上使用。

@放置在集合上的Immutable使集合不可变,这意味着不允许向集合中添加或从集合中删除内容。在这种情况下会抛出HibernateException。

据我所知,对于在*.hbm.xml中使表不可变,Mutable="false"属性会有所帮助。

翟兴邦
2023-03-14

HiberNate不太喜欢不可变的对象。你最好的选择是

  • 使用不使用final关键字但没有设置器的伪不可变对象,然后告诉Hibernate通过字段设置值
劳英华
2023-03-14

您可以告诉hiberNate使用字段访问(在您的hbm中属性access=field),这样hiberNate就不会抱怨缺少访问器。

Hibernate使用反射来修改最终字段,这样它就可以工作了。

 类似资料:
  • 问题内容: 我正在努力使可变对象与不可变对象有关。使用可变对象会带来很多负面影响(例如,从方法中返回字符串数组),但是我很难理解它的负面影响。使用可变对象的最佳实践是什么?您是否应尽可能避免使用它们? 问题答案: 好吧,这有几个方面。 没有参考身份的可变对象会在奇数时间导致错误。例如,考虑使用基于值的方法的 : 当实例用作键时,实例在映射中“丢失”,因为实例和相等性基于可变值。这些值在映射之外更改

  • 本文向大家介绍浅谈Python中的可变对象和不可变对象,包括了浅谈Python中的可变对象和不可变对象的使用技巧和注意事项,需要的朋友参考一下 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。 可变对象,该对象所指向的内存中的值可以被改变。变量(准确

  • 问题内容: 这是Java Concurrency in Practice中的一句话 共享的只读对象包括不可变的和实际上不可变的对象。 不变对象和有效不变对象之间有什么区别? 问题答案: 不可扩展且其字段全部为自身且不可变的类的实例是不可变的。 由于其方法的详细信息而无法更改其字段的类的实例实际上是不可变的。例如: 的某些实例实际上是不可变的,而有些则不是。 另一个例子是零长度数组。它们实际上是不可

  • 我们正在使用不可变框架来生成所有的DTO。现在我们想用MapStruct将这些对象映射到另一个对象。但是生成的DTO是不可变的,没有设置器和构造器,对应于构建器模式。它们只通过静态-方法访问的相应生成器来填充。 相反,我们尝试将DTO1映射到DTO2.Builder,如果mapstruct能够识别生成器中的setter,那么它就可以工作,但是它们没有void返回类型,而是返回生成器本身,以便进行流

  • 问题内容: 为什么以下脚本会给出错误: 问题答案: 在Python 3中,返回类型为的可迭代对象,而不是可下标的列表,该列表允许您编写。要强制列出结果,请写 但是,在许多情况下,您可以不使用索引来更好地编写代码。例如,使用列表推导:

  • 我想确保我正确理解根据Java内存模型的‘有效不可变对象’行为。 假设我们有一个可变类,我们希望将它发布为一个有效不可变的类: 我们执行以下操作: 问题是:Java内存模型是否保证所有线程必须具有? 根据Java并发实践,这应该是正确的,但如果我错了,请纠正我。 3.5.3.安全发布习语 要安全地发布对象,必须同时使对对象的引用和对象的状态对其他线程可见。通过以下方法可以安全地发布正确构造的对象: