我有一个有点标准化的数据库,其中实体对象由其他实体组成,我将在会话和应用程序范围内单独发布根实体,并在 Java Web 应用程序的集合中发布。我想知道将根 Entity 对象转换为线程安全且能够在 Web 应用程序环境中发布的不可变对象的最佳方法是什么。我找到的方法是:
1) 使用构建器将实体转换为 DAO 中的不可变对象。这似乎是最编程的,即必须遍历整个实体来设置不可变对象,但对于多线程环境来说,这似乎也是最安全的。
2)使用工厂/构建器将实体转换为由 get 方法组成的只读接口,在此问题上对此进行了描述。这看起来很酷,但我从未在实践中尝试过,而且它似乎不是完全线程安全的,因为字段不是最终的,并且对象在某种程度上是可变的,只是不是任何使用 read- 的应用程序唯一版本。
3) 使用特定于供应商的东西,例如 Hibernate 的 @Immutable 注释。起初这听起来不错,但在确保没有集合返回不可变值之后,它开始看起来像上面的选项 1,我只是通过迭代所有值并将它们转换为原始实体的不可变副本构建一个不可变的版本。此外,我找不到任何在 Web 应用程序中使用和发布 @Immutable 实体的示例。有没有人有这方面的经验,它是线程安全的吗?
实体关系示例(不完整且无功能,只是为了显示嵌套质量):
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;
}
感谢您的任何帮助。