@ElementCollection当字段值相等时,@ Embiddable的映射不会保留

时间:2014-01-08 08:55:05

标签: java mysql jpa eclipselink glassfish-3

我在将元素插入由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

1 个答案:

答案 0 :(得分:1)

刚刚再次测试,我发现问题是专门用于事务管理。我根本不想使用交易,所以我用@TransactionManagement(TransactionManagementType.BEAN)注释了我的SLSB。 当我删除它时,事务由容器管理,然后更新按预期工作。

将事务管理设置为容器管理不是我希望的解决方案,但现在可以使用。我仍然认为这是eclipselink中的一个错误。