【问题标题】:Can I Modify Hibernate/JPA Attribute Dynamically?我可以动态修改 Hibernate/JPA 属性吗?
【发布时间】:2016-02-07 16:41:12
【问题描述】:

我有一个实体,它有一列我需要为特定配置或会话工厂创建瞬态。基本上,该列不应该在一个特定配置的更新或插入语句中发送,并且在检索数据时将由拦截器设置。对于任何其他配置,该列应保留在数据库中。有没有办法根据会话工厂或配置在运行时/动态地配置列?我能够使列瞬态并正确设置它,但我需要它在某些配置中保持不变。

编辑我最初输入“过滤器”但意思是“拦截器”

【问题讨论】:

  • 你能忍受在你不希望它持续存在的配置中插入空值吗?您可以在这些配置的拦截器中将其设置为 null。

标签: java hibernate jpa


【解决方案1】:

注解是一种句法元数据,可以添加到 Java 源代码中,因此您无法在运行时对其进行更改。

但是,如果有必要,程序员可以在运行时通过反射 api 访问 java 注释。 here 是一个关于如何使用 Javassist 添加注解的示例。

正如 Dragan 所建议的,我的建议是,您可以在不需要的地方将其设置为 null。

【讨论】:

  • 将字段设置为 null 仍然会导致在 hibernate 持久化对象时将其发送过来,不是吗?
  • 假设您已使特定列变为瞬态。现在,当您将其插入数据库时​​,表的结构不会改变。如果您不希望数据库中有特定列,则可以将这样的数据插入新表中。这就是为什么我认为这样的功能没有与hibernate一起提供。如果您认为我在某处失踪,请通知我。
  • 我创建了一个模式图,希望能更好地解释这一点:)。我知道这并不完美,但它可能会让我的意图更加清晰。
【解决方案2】:

您可以创建两个实体,作为一个表的映射。在第一个中,您的专栏将是短暂的,而在另一个则不会。我已经遇到过这样的麻烦,我认为打开会话后无法更改映射配置。

【讨论】: