【问题标题】:Changing field types in a Hibernate entity?更改 Hibernate 实体中的字段类型?
【发布时间】:2012-02-29 05:19:31
【问题描述】:

我正在使用 Hibernate 来存储一个数据模型,它有许多简单的字段:

@Entity
public class Shape extends DomainObject {

    @LazyCollection(LazyCollectionOption.FALSE)
    @CollectionOfElements()
    private List<Shape> children;

    @Column
    private int numSides;

    ... etc. ...
}

DomainObject 超类跟踪 Long id

我们想对children List 进行更改,这样它就不再是简单的List,而是实际上是Map,其中键是Long id(来自超类) .

@???
private Map<Long, Shape> children;

在 Hibernate 中如何处理这种性质的迁移/类型更改?我对 Hibernate 的这方面不太熟悉 - 是否有一些方法可以重载以接受 List&lt;Shape&gt; (在应用程序的第一次加载时,使用旧数据)并手动生成新的 @987654331 @?

【问题讨论】:

    标签: java hibernate list map h2


    【解决方案1】:

    数据库中应该没有任何区别:您只是选择使用 Map 而不是 List 来存储 Shapes,但 Shape 实体的属性保持不变,因此存储 Shapes 的表也具有相同的列。

    【讨论】:

    • 假设我使用原始数据模型已经有一段时间了,我有一个包含 10 个孩子的 Shape。当我更改数据模型并重新启动应用程序时,地图将包含什么?钥匙是什么?
    • 在使用Map时,必须使用目标实体(Shape)的属性之一作为map的key,使用@MapKey。默认情况下,键是目标实体的 ID。所以地图将包含列表中的所有元素,由它们的 ID 索引。如果您需要更改架构,请使用您首选的 SQL 工具来迁移数据,然后使用新映射启动您的应用程序。但在这种情况下,应该没有必要。
    • 谢谢 - Hibernate 有任何可用的内置映射工具/功能吗?可以在我们的应用程序中执行的操作?我们的应用程序使用 Hibernate 作为数据存储,并在多个客户端站点上使用。必须访问每个位置并执行手动 SQL 迁移会很乏味。 (对于更复杂的迁移,就是这样。)
    • 不,Hibernate 没有任何东西。但是用批处理文件包装的简单 SQL 脚本非常容易使用。
    猜你喜欢
    • 2018-09-19
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2012-05-07
    • 2013-11-24
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多