使JPA / Hibernate实体不可变/线程安全的首选方法

时间:2012-08-14 14:28:17

标签: hibernate jpa thread-safety entity immutability

我有一个规范化的数据库,其中的权限对象由其他实体组成,我将在会话和应用程序范围内的java Web应用程序中自己和集合中发布根实体。我很奇怪最好的方法是将根Entity对象转换为线程安全且能够在Web应用程序环境中发布的不可变对象。我找到的方法是:

1)使用构建器将实体转换为DAO中的不可变对象。这似乎是最多的编程,即必须迭代整个实体来设置不可变对象,但它似乎也是多线程环境中最安全的。

2)使用将实体强制转换为由get方法组成的只读接口的工厂/构建器,在此问题here中描述。这看起来很酷,但我从来没有在实践中尝试过,它似乎并不是完全线程安全的,因为字段不是最终的,并且对象在某种程度上是可变的,而不是任何使用read的应用程序只有版本。

3)使用像Hibernate的@Immutable注释这样的特定供应商。这听起来不错,但在确保没有集合返回不可变值之后,它开始看起来像上面的选项1,我只是通过迭代它的所有值并将它们转换成原始实体来构建不可变的副本。一个不可变的版本。此外,我找不到任何使用@Immutable实体并在Web应用程序中发布的示例。有没有人有这方面的经验,它是线程安全的吗?

示例实体关系(不完整和无功能,仅显示嵌套质量):

class A {
    @Id
    private long id;

    @OneToOne
    @JoinColumn
    private B b;
}

class B {

    @Id
    private long id

    private String something;

    @OneToMany
    @JoinTable
    private List<C> cs;
}

class C {
    @Id
    private long id;

    @Column
    private String name;

    @Column
    private String otherName;
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

对于我的意见选项:

创建私有默认构造函数(hibernate所需的默认构造函数)。 为所有字段创建完整的构造函数,并将它们定义为私有。