当前位置: 首页 > 知识库问答 >
问题:

当字段值相等时,@ElementCollection Map的@Embed不持久化

柴嘉禧
2023-03-14

我在将元素插入地图表示的@ElementCollection时遇到问题。插入具有相同值的元素时,它们不会被持久化。给定以下@实体及其@可嵌入

@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 |           |         |
+-------------+-------------+-----------+---------+

插入工作正常,如果标签1和标签2不同的每个地图条目(如上所述)。

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

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

这是Eclipselink中的一个bug还是我做错了什么?

编辑:

我已经设置了-Declipselink。登录中。level=FINEST,这表明没有对第二个和后面的带有空标签的条目执行SQL。

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

共有1个答案

洪念
2023-03-14

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

将事务管理设置为container managed并不是我所希望的解决方案,但目前它仍然有效。我仍然认为这是日食中的一个错误。

 类似资料:
  • 默认情况下,所有 ItemReader 和 ItemWriter 在提交之前都会把当前状态信息保存到 ExecutionContext 中。 但有时我们又不希望保存这些信息。 例如,许多开发者使用处理指示器(process indicator)让数据库读取程序 ‘可重复运行(rerunnable)’。 在数据表中添加一个附加列来标识该记录是否已被处理。 当某条记录被读取/写入时,就将标志位从 fa

  • 我在JPA实体类中有问题。这个实体工作正常,但今天我添加了另一个字段(一个简单的字符串,varchar(255)在数据库中不为NULL)。当我尝试持久化一个新实体时,我得到 嗯,这是真的。该列没有默认值。但在我的代码中,我为它设置了值。查看生成的insert语句时,该字段不存在。 变量的名称与列名匹配,因此没有可能导致错误的注释。它的处理方式与其他工作正常的字段/列一样。 提前感谢您的帮助! 编辑

  • 问题内容: 首先采取klurudge解决方案,使用哨兵方法(必须让您的程序不允许输入哨兵值): 假设您忘记了阻止程序中的哨兵值,用户在B字段中输入了-2147483648,而A为空。上面的代码报告为true,应报告为false,不应报告为true或null。 比较可为空字段上的相等性的最简洁方法是什么?A == B仅应报告true或false,而不管该字段是否可为空。 问题答案: 也许IS [NO

  • 假设我有一个Foo类和一个jax-rs FooResource,它将API公开给CRUD Foos。 Foo表示MongoDB文档。 在FooResource中,我将有如下内容: 问题是,json中的foo对象将只包含已经更改的字段,但我从来不知道它将是什么字段。 我使用带Panache扩展的Quarkus,我看到的唯一方法是从DB检索实体,然后检查从http请求接收到的foo对象中的每个字段,看

  • 我正在制作一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我有与数据库条目匹配的“alex|ppp”。以下方法首先调用 我已经仔细检查了user和Pass的值,它们是“alex”和“ppp”,这是预期的。下一个初始文件被调用,这是相关代码: 一旦我调用db.tryLogin()就会出现问题,它看起来像这样 我已经检查过了,dbPass从数据库返回的“ppp”与

  • 我想在一个Android应用程序中使用3个片段,ired:creating-and-using-fragmentpageradapter。但是我想使用viewpager来滑动和显示片段,就像在:ViewPager-with-FragmentPagerAdapter中解释的那样。但是这个代码或者Android Studio示例的默认代码,每次需要时使用newInstance创建实例,不需要时销毁。