0

我有一个非常复杂的实体,我希望分两个阶段加载:

  1. 加载所有业务数据
  2. 加载所有元数据

我想分开装载。

我可以仅使用反射 API 在运行时将字段声明为 @Transient 吗?我尝试使用 preLoad 事件,但找不到如何设置字段瞬态。

谢谢伊多布

4

2 回答 2

2

您不能在运行时使用反射更改 Java 中的任何注释。此处是有关如何使用 Javassist 添加注释的示例。

于 2013-01-31T14:05:44.157 回答
2

1)注解信息是java类信息的一部分。您不能在运行时更改。当然,您可以生成一些字节码生成工具:javaassistcglib来生成类并在运行时加载适当的实体实现。但它看起来像丑陋的黑客。此外,此解决方案非常复杂且不稳定。

2)尽量不要在你的应用程序中增加复杂性。更好地重构现有的域模型。考虑一下您是否需要为您的域提供多个固定表示。

3)此外,如果您确实需要实体的弱结构,您可以将实体序列化为 XML 或二进制格式,并作为文本(或者您的数据库支持XMLType)或 Blob 存储在 DB 中。


如果您遇到 LazyInitializationException 问题并且您开发 Web 应用程序,请尝试考虑OpenSessionInView模式。Hibernate 将为每个请求创建一个 Hibernate 会话。因此,您可以在一个请求中操作 Hibernate 对象,而无需考虑 LazyInitializationException。

于 2013-01-31T14:16:52.723 回答