当前位置: 首页 > 面试题库 >

OpenJPA-嵌套的一对多关系合并问题

毋城
2023-03-14
问题内容

将其发布在这里是因为我在这里没有太大的兴趣:http : //www.java-
forums.org/jpa/96175-openjpa-one-many-within-one-many-merge-
problems.html

试图找出这是OpenJPA的问题还是我做错了…

尝试使用OpenJPA更新包含与另一个实体具有一对多关系的实体时,遇到一个问题。这是我正在谈论的简单示例

@Entity
@Table(name = "school")
public class School {

    @Column(name = "id")
    protected Long id;

    @Column(name = "name")
    protected String name;

    @OneToMany(mappedBy = "school", orphanRemoval = true, cascade = CascadeType.ALL)
    protected Collection<ClassRoom> classRooms;
}

@Entity
@Table(name = "classroom")
public class ClassRoom {

    @Column(name = "id")
    protected Long id;

    @Column(name = "room_number")
    protected String roomNumber;

    @ManyToOne
    @JoinColumn(name = "school_id")
    protected School school;

    @OneToMany(mappedBy = "classRoom", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    protected Collection<Desk> desks;

}

@Entity
@Table(name = "desk")
public class Desk {

    @Column(name = "id")
    protected Long id;

    @ManyToOne
    @JoinColumn(name = "classroom_id")
    protected ClassRoom classRoom;

}

在SchoolService类中,我具有以下更新方法:

    @Transactional
    public void update(School school) {
        em.merge(school);
    }

我正在尝试从学校中删除一间教室。我将其从classRooms集合中删除并调用更新。我注意到教室没有书桌,没有问题。但是,如果教室有桌子,它会抛出一个约束错误,因为它似乎首先尝试删除教室,然后再删除桌子。(教室ID列有一个外键约束)

我会以错误的方式处理吗?我是否缺少某些设置才能让它先删除内部的“桌面”实例,然后再删除已删除的“课堂”实例?

任何帮助,将不胜感激。如果您需要更多信息,请告诉我。谢谢,


问题答案:

将删除操作级联到子实体时,OpenJPA中有许多有关FK违规的错误报告:

OpenJPA FAQ指出:

http://openjpa.apache.org/faq.html#reorder

OpenJPA可以对SQL语句重新排序以满足数据库外键约束吗?

是。OpenJPA可以使用不同的可配置策略对SQL语句进行重新排序和/或批处理。默认策略能够对SQL语句重新排序以满足外键约束。
但是,您必须告诉OpenJPA从数据库模式中读取现有的外键信息:

似乎可以通过在OpenJPA配置中设置以下属性来强制语句的正确排序

<property name="openjpa.jdbc.SchemaFactory"> value="native(ForeignKeys=true)"/>

或通过将org.apache.openjpa.persistence.jdbc.ForeignKey批注添加到映射中:

@OneToMany(mappedBy = "classRoom", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@org.apache.openjpa.persistence.jdbc.ForeignKey
protected Collection<Desk> desks;

也可以看看:

https://issues.apache.org/jira/browse/OPENJPA-1936



 类似资料:
  • 我有一个组织表,部门表和员工表。一个组织有许多部门,一个部门有许多员工。在执行 (组织的 PK)时,我看到 Employee 表也被查询 n 次,其中 n 是组织的部门数。 如何避免在执行相同操作时获取员工数据?我在这里看到了一个N 1问题。但不确定如何在嵌套的一对多映射中避免它。 提取类型设置为“延迟”。

  • 现在,如果我在商品列表中添加第二个商品,我会出现以下错误: 菜单[menuid=1,menu_name=dsad,menu_description=null,类别=[category_id=1,categoryname=A,goods=[GoodsImp[id=1,Brand=asd,createddate=Mon Jan 22 18:26:35 ART 2018],价格=3.0,descript

  • 问题内容: 我在laravel中很难建立起非常嵌套的关系。 所需的行为如下, 我通过ID选择一个事件,我想查看哪些人已订阅该事件。 现在的问题是事件和人员之间有一些表格。 这是有效的查询! 事件模型 城市模型 公司模式 人物模型 我尝试过的 和 还有很多其他可能性,我真的很坚持。在laravel中实现这种嵌套关系链接如此困难吗? 谢谢! 问题答案: 如果只想从表中选择某些字段,请使用以下命令:

  • 在之前,创建一个有依赖其他模型的模型的时候,我们需要提前把依赖的模型给建立好,这样就非常麻烦,是不是有那么一种方法,在一个 create 里面把其他的依赖模型一起新建出来呢? 这一小节就来解决这个问题。这其中有一个坑(关于命名),让我调试的头皮发麻。 Book 与 User 的 belongs 关系 1. 保存关系 来到 book.ts , 首先保存一下 this.belongsTo 的返回值,在

  • 问题内容: 我已经建立了一个简单的多对多关系帐户:Hibernate角色,但是当我在添加角色后尝试在单元测试中保存帐户时,出现UnsupportedOperationException异常: 这是怎么了 我的实体设置有问题吗?或者这是hibernate或JPA限制,迫使我将m:m关系分解为3:n关系,也为m:n关系表建模(我想避免这种情况,因为它没有任何关系)附加信息)。我已经在原型中为其他1:n