Hibernate组件映射不可变对象

时间:2013-03-21 22:31:00

标签: java hibernate

我有一个不可变对象,它是使用组件映射的Hibernate持久化对象的成员。示例,PinDrop对应于一个表,其中包含一个类型为immutable 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没有xy的设置器。有没有办法使用不可变对象作为Hibernate持久对象的组件?

后续行动:我没有使用注释,而是使用hbm.xmlmutableimmutable都不是component中的有效属性和property中的hbm.xml

3 个答案:

答案 0 :(得分:7)

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

Hibernate使用反射修改最终字段,以便它可以工作。

答案 1 :(得分:3)

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

  • 使用不使用final关键字但没有setter的伪不可变对象,然后告诉Hibernate通过字段设置值。
  • 让hibernate填充可变构建器对象,然后将其属性复制到适当的不可变对象中。不幸的是,这意味着每个BO / DTO都有两个类。

答案 2 :(得分:1)

您是否尝试过使用@Immutable注释?

  

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

     

应用程序可能不会更新不可变实体。更新到   不可变实体将被忽略,但不会抛出任何异常。   @Immutable必须仅用于根实体。

     

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

据我所知,在* .hbm.xml中创建一个表不可变,mutable="false"属性可以帮助。