2012-02-07 81 views
2

我使用Hibernate来存储一个数据模型,其中有一些简单的领域:更改Hibernate实体中的字段类型?

@Entity 
public class Shape extends DomainObject { 

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

    @Column 
    private int numSides; 

    ... etc. ... 
} 

DomainObject超跟踪的Long id的。

我们想做出改变的childrenList,这样的而不是一个简单的List,它实际上是一个Map其中关键是Long id(从超)。

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

在Hibernate中如何处理这种性质的迁移/类型变化?我对Hibernate的这个方面不太熟悉 - 是否有一些方法可以超载来接受List<Shape>(在应用程序的第一次加载时,使用旧数据)并执行手动生成新的Map

回答

2

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

+0

比方说,我一直在使用原始数据模型,并且我有一个包含10个子项的Shape。当我对数据模型进行更改并重新启动应用程序时,Map将包含什么?关键是什么? – 2012-02-07 19:16:07

+0

使用Map时,必须使用@MapKey将目标实体(Shape)的某个属性用作地图的键。默认情况下,密钥是目标实体的ID。因此,地图将包含列表中的所有元素,并按其ID进行索引。如果您需要更改架构,请使用您首选的SQL工具迁移数据,然后使用新映射启动您的应用程序。但在这种情况下,它不应该是必要的。 – 2012-02-07 19:19:14

+0

谢谢 - Hibernate是否有可用的内置映射工具/功能?一些可以在我们的应用程序内执行的东西?我们的应用程序使用Hibernate作为数据存储,并在多个客户端网站上使用。必须访问每个位置并执行手动SQL迁移将非常繁琐。 (对于更复杂的迁移,就是这样)。 – 2012-02-07 19:23:08