繁体   English   中英

JPA ManyToMany双向插入

[英]JPA ManyToMany bi-directional insert

我有问题,我找不到解决方案。 我有双向多对多注释。 我在DB(mariaDB)中有此表:

  • 项目
  • 部分
  • item_section

项目部分:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "item_section",
        joinColumns = {
            @JoinColumn(name = "item", nullable = false, updatable = false)},
        inverseJoinColumns = {
            @JoinColumn(name = "section", nullable = false, updatable = false)})
private Set<Section> sections;

部分:

@ManyToMany(fetch = FetchType.EAGER, mappedBy = "sections")
private Set<Item> items;

问题:

我首先创建一些部分。 比我想在此部分中“创建”项目。 因此,我创建了Item的实例,并将一些现有的Sections添加到集合中(Sections from DAO)。 如果我坚持使用Item,则会在item和item_section表中创建记录。 但是,如果我从DAO获取了一些受影响的部分,并且没有通过项目迭代设置数据库更改,则Sections实例的状态与插入之前的状态相同。

我怎么了

PS:我使用eclipselink,但我认为这并不有趣

就像@克里斯说的那样,我最终打电话给坚持,但方向的一面已经存在。 没有定义级联,因此在持久段期间既不持久也不合并。 因此,对于我的staless和JTA解决方案而言,最好的解决方案是使用合并而不是在项目上坚持,并将MERGE级联添加到节集合中...

谢谢大家的帮助,尤其是@Chris

似乎您缺少属性级联= CascadeType.ALL。 你应该尝试改变

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "item_section",
        joinColumns = {
            @JoinColumn(name = "item", nullable = false, updatable = false)},
        inverseJoinColumns = {
            @JoinColumn(name = "section", nullable = false, updatable = false)})
private Set<Section> sections;

@ManyToMany(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
@JoinTable(name = "item_section",
        joinColumns = {
            @JoinColumn(name = "item", nullable = false, updatable = false)},
        inverseJoinColumns = {
            @JoinColumn(name = "section", nullable = false, updatable = false)})
private Set<Section> sections;

然后它正常工作。

我通过Hibernate多对多双向映射示例教程发现了这个错误

希望这个帮助

问题可能是由于使用了默认启用的eclipselink共享缓存不正确。 尝试通过添加persistence.xml来禁用它:

<shared-cache-mode>NONE</shared-cache-mode>

当您保留或合并时, Section provider会将其刷新到数据库,并将Section实例添加到共享缓存中,以便下次请求时可以从内存中检索它。 当您保留Item您只会更新关系的一侧,但是另一侧不会更新,并且会变得不同步。 在JPA中,就像通常在Java中一样,维护关系是应用程序或对象模型的责任。 如果您的应用程序添加到关系的一侧,则它必须添加到关系的另一侧。 本文中阅读有关双向映射缓存的更多信息。 我可以为您的问题提供以下解决方案:

  1. persistence.xml禁用整个应用程序的缓存
  2. 在将其检索给用户之前,手动刷新DAO中的Section
  3. 通过更新关系的两侧来正确使用缓存:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM