4

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

@LazyCollection(LazyCollectionOption.FALSE)
@CollectionOfElements
@Column()
private List<String> permissions = Collections.emptyList();

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

H4升级前的用户权限

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

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

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

之后的用户权限

我的问题:

  1. 是否有从旧@CollectionOfElements到新的 DDL/模式更改的完整列表@ElementCollection
  2. 是否有推荐的做法或我可以为这些属性提供的附加注释,以确保向后兼容性?(我可以指定特定的名称映射方案或列名吗?)
  3. 最后,我假设所有Collection类型都会受到此更改的影响 - Sets,Maps等。我只是想确保我们在升级过程中不会留下任何数据或不遗余力。
4

1 回答 1

7

第一个问题:

我一个都不知道。但是 JPA 规范是免费提供的,它描述了默认的表和列名是什么。

第二个问题:

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

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

第三个问题:是的,收藏的性质无关紧要。请参阅第二个问题的答案以避免此类问题。

于 2012-06-04T18:53:49.600 回答