我正在使用Hibernate来保存我的实体(完整的堆栈包括struts2,spring,jpa和amp; hibernate)。
我有两个类List
和Pie
,并且都继承自Widget
类(使用InheritanceType.JOINED
)。我无法理解这种情况:我已将List
实体持久存储到数据库中。但现在我想用Pie
实体替换它。我怎么能这样做?
我唯一能想到的就是创建另一个实体,复制公共属性,删除旧属性并保留新属性(具有不同的id),当然都在事务中。
你知道其他任何方法吗?
非常感谢。
答案 0 :(得分:1)
另一种方法是使用本机查询直接修改存储的实体。如果使用的是鉴别器列,则可以修改存储在A类列中的值,并将其更改为B类所需的值。您还需要修改现有数据以匹配新类。
我提到这是一种替代方法,但我并不是说它必然是推荐的方法。使用此技术可能会导致缓存问题,并可能影响可能存在的任何活动对象。
您提到的方法是您可以在JPA空间中使用的更清晰的方法之一。
编辑
此方法适用于所有继承策略。对于JOINED和TABLE_PER_CLASS继承,您将需要写入查询,这些查询将在表之间迁移数据,以及根据所使用的策略可能需要设置的任何鉴别器列更改。
从长远来看,这种方法可能会极大地影响应用程序的可维护性。您提到的方法的一个好处是您可以利用反射快速复制两个对象之间的公共字段,这简化了将来的维护。