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