5

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

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.hbm.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没有用于xand的设置器y。有没有办法将不可变对象用作 Hibernate 持久对象的组件?

后续:我没有使用注解,而是hbm.xml. mutable上和中immutable的有效属性都不是。componentpropertyhbm.xml

4

3 回答 3

7

你可以告诉 hibernate 使用字段访问(access=field你的 hbm 中的属性),所以 hibernate 不会抱怨缺少访问器。

Hibernate 使用反射来修改最终字段,因此它应该可以工作。

于 2013-03-21T22:54:47.907 回答
3

Hibernate 并不喜欢不可变对象。您最好的选择是

  • 使用不使用final关键字但没有设置器的伪不可变对象,然后告诉 Hibernate 通过字段设置值。
  • 让休眠填充可变构建器对象,然后将其属性复制到适当的不可变对象中。不幸的是,这意味着每个 BO/DTO 都有两个类。
于 2013-03-21T23:30:53.637 回答
1

您是否尝试过@Immutable注释?

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

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

@Immutable 放置在集合上使集合不可变,这意味着不允许对集合进行添加和删除。在这种情况下会引发 HibernateException。

据我所知,在 *.hbm.xml 中使表不可变,mutable="false"属性可以提供帮助。

于 2013-03-21T22:40:36.710 回答