我在将元素插入由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 | | |
+-------------+-------------+-----------+---------+
如果每个地图条目的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
答案 0 :(得分:1)
刚刚再次测试,我发现问题是专门用于事务管理。我根本不想使用交易,所以我用@TransactionManagement(TransactionManagementType.BEAN)
注释了我的SLSB。
当我删除它时,事务由容器管理,然后更新按预期工作。
将事务管理设置为容器管理不是我希望的解决方案,但现在可以使用。我仍然认为这是eclipselink中的一个错误。