gpt4 book ai didi

java - 当字段值相等时,@Embeddable 的 @ElementCollection Map 不会保留

转载 作者:行者123 更新时间:2023-11-29 03:02:28 29 4
gpt4 key购买 nike

我在将元素插入由 Map 表示的 @ElementCollection 时遇到问题。插入具有相同值的元素时,它们不会持久化。给定以下 @Entity 及其 @Embeddable:

@Entity
@Table(name = "category", catalog = "my_db", schema = "")
public class Category implements Serializable {

@Id
@Column(name = "id")
private Integer id;

@ElementCollection(fetch = FetchType.LAZY, targetClass = CategoryLabels.class)
@CollectionTable(name = "category_labels", joinColumns =
@JoinColumn(name = "category_id"), catalog = "my_db")
@MapKeyColumn(name = "language_id")
private Map<Integer, CategoryLabels> labels = new HashMap<Integer, CategoryLabels>();

...
}


@Embeddable
public class CategoryLabels implements Serializable {
@Column(name = "label1")
private String label1;

@Column(name = "label2")
private String label2;

...
}

数据库条目

+-------------+-------------+-----------+---------+
| category_id | language_id | label1 | label2 |
+-------------+-------------+-----------+---------+
| 183 | 1 | Capacity | Timings |
| 183 | 2 | | |
+-------------+-------------+-----------+---------+

如果每个 map 条目的 label1 和 label2 不同(如上所示),则插入工作正常。

但是,如果我添加一个与另一个条目具有相同的 label1 和 label2 值的条目,则第二个条目从不持久化到数据库中。例如,如果我向 Map 添加一个条目,两个标签都为空(如示例中的第二个条目)但 language_id=3,这将永远不会持久化。

我知道这个常见问题:http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection#Common_Problems并且检查没有 ID 的嵌入对象的字段和外键 @JoinColumns 作为 ID。这在我的情况下似乎不起作用,@JoinColumn 中的外键在 ID 检查中被完全忽略。

这是 Eclipselink 中的错误还是我做错了什么?

编辑:

我已经设置了 -Declipselink.logging.level=FINEST,这表明没有为带有空标签的第二个和后续条目执行任何 SQL。

此外,我还制作了一个示例项目,您可以使用它来重现该问题: http://bit.ly/1bR8ywO

最佳答案

刚刚再次测试,我发现问题出在事务管理上。我根本不想使用事务,所以我用 @TransactionManagement(TransactionManagementType.BEAN) 注释了我的 SLSB。当我删除它时,事务由容器管理,然后更新按预期进行。

将事务管理设置为容器管理并不是我希望的解决方案,但目前可行。我仍然认为这是 eclipselink 中的一个错误。

关于java - 当字段值相等时,@Embeddable 的 @ElementCollection Map 不会保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20990889/

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