升级到Hibernate4和@ElementCollection会导致无法查找现有数据

Cra*_*tis 4 java sql hibernate h2

我们有一个User具有List<String>权限的模型类,如下所示:

@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

它生成了一个SQL表,其中包含如下条目:

H4升级前的用户权限

我们最近升级到了Hibernate 4,并且由于@CollectionOfElements注释已从弃用变为完全删除,我们认为这是转移到的好时机@ElementCollection,如下所示:

@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection // << CHANGED
@Column()
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

但是,在启动时,我们无法使用我们的管理帐户登录.好奇,我们使用H2的JAR检查了数据库,发现该表已被更改:

用户权限之后

我的问题:

  1. 是否有从旧@CollectionOfElements到新的DDL /架构更改的完整列表@ElementCollection
  2. 是否有推荐的做法,或我可以为这些属性提供的其他注释,以确保向后兼容性?(我可以指定特定的名称映射方案或列名吗?)
  3. 最后,我想所有Collection类型都将受到这一更改的影响- Sets,Maps等我只是想确保我们不会留下任何数据的背后,还是想尽一切办法,我们的升级过程中.

JB *_*zet 7

第一个问题:

我不知道.但JPA规范是免费提供的,并描述了默认的表和列名称.

第二个问题:

@ElementCollection
@CollectionTable(name = "USER_PERMISSIONS"
                 joinColumns = @JoinColumn(name = "USER_ID"))
@Column(name = "ELEMENT")
private List<String> permissions = Collections.emptyList();
Run Code Online (Sandbox Code Playgroud)

我个人总是指定表名和列名.它避免了这种惊喜,让我总能选择我想要的名字,并且是自我纪录的.而且我也更喜欢自己创建数据库模式和DDL.这可确保正确创建所有必需的索引,约束,注释等.

第三个问题:是的,收集的性质无关紧要.请参阅第二个问题的答案,以避免出现这些问题.