[英]JPA ManyToMany bi-directional insert
我有问题,我找不到解决方案。 我有双向多对多注释。 我在DB(mariaDB)中有此表:
项目部分:
@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中一样,维护关系是应用程序或对象模型的责任。 如果您的应用程序添加到关系的一侧,则它必须添加到关系的另一侧。 在本文中阅读有关双向映射缓存的更多信息。 我可以为您的问题提供以下解决方案:
persistence.xml
禁用整个应用程序的缓存 Section
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.