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