我有一个非常复杂的实体,我希望分两个阶段加载:
- 加载所有业务数据
- 加载所有元数据
我想分开装载。
我可以仅使用反射 API 在运行时将字段声明为 @Transient 吗?我尝试使用 preLoad 事件,但找不到如何设置字段瞬态。
谢谢伊多布
我有一个非常复杂的实体,我希望分两个阶段加载:
我想分开装载。
我可以仅使用反射 API 在运行时将字段声明为 @Transient 吗?我尝试使用 preLoad 事件,但找不到如何设置字段瞬态。
谢谢伊多布
您不能在运行时使用反射更改 Java 中的任何注释。此处是有关如何使用 Javassist 添加注释的示例。
1)注解信息是java类信息的一部分。您不能在运行时更改。当然,您可以生成一些字节码生成工具:javaassist或cglib来生成类并在运行时加载适当的实体实现。但它看起来像丑陋的黑客。此外,此解决方案非常复杂且不稳定。
2)尽量不要在你的应用程序中增加复杂性。更好地重构现有的域模型。考虑一下您是否需要为您的域提供多个固定表示。
3)此外,如果您确实需要实体的弱结构,您可以将实体序列化为 XML 或二进制格式,并作为文本(或者您的数据库支持XMLType)或 Blob 存储在 DB 中。
如果您遇到 LazyInitializationException 问题并且您开发 Web 应用程序,请尝试考虑OpenSessionInView模式。Hibernate 将为每个请求创建一个 Hibernate 会话。因此,您可以在一个请求中操作 Hibernate 对象,而无需考虑 LazyInitializationException。