gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 01:55:30 24 4
gpt4 key购买 nike

我们有一个模型类 User有一个List<String>权限,像这样:

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

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

User permissions before H4 upgrade

我们最近升级到 Hibernate 4,并且作为 @CollectionOfElements注释已从弃用变为完全删除,我们认为这是转移到 @ElementCollection 的好时机,像这样:

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

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

User permissions after

我的问题:

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

最佳答案

第一个问题:

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

第二个问题:

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

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

第三个问题:是的,集合的性质并不重要。请参阅第二个问题的答案以避免此类问题。

关于java - 升级到 Hibernate4 和 @ElementCollection 导致无法查找现有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10886138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com