OpenJPA – 嵌套的OneToMany关系合并问题
在这里发布,因为我没有看到很多兴趣: 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 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 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集合中删除它并调用update。 我注意到教室没有办公桌,没有问题。 但是如果Class Room有桌子,它会抛出一个约束错误,因为它似乎首先尝试删除Class Room,然后是Desks。 (classes_id列有一个外键约束)
我是以错误的方式来做这件事的吗? 在删除已删除的Class Room实例之前,是否有一些设置我缺少让它删除内部“Desk”实例?
任何帮助,将不胜感激。 如果您需要更多信息,请告诉我们。 谢谢,
当级联删除操作到子实体时,OpenJPA中有关于FK违规的各种错误报告:
OpenJPA FAQ注意到以下内容:
http://openjpa.apache.org/faq.html#reorder
OpenJPA可以重新排序SQL语句以满足数据库外键约束吗?
是。 OpenJPA可以使用不同的可配置策略对SQL语句进行重新排序和/或批处理。 默认策略能够重新排序SQL语句以满足外键约束。 但是,您必须告诉OpenJPA从数据库模式中读取现有的外键信息:
通过在OpenJPA配置中设置以下属性,您似乎可以强制正确排序语句
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 desks;
也可以看看:
- 如何配置用于JavaMail的邮件服务器?
- 使用XML DOM添加名称空间前缀XML String
- 线程“main”中的exceptionorg.apache.spark.SparkException:此JVM中只能运行一个SparkContext(参见SPARK-2243)
- 缓冲图像像素操作
- 为什么Java原始数据类型不是Java数据类型?
- Java / Hibernate JPA:InheritanceType.TABLE_PER_CLASS和ID
- 来自commons-httpclient-3.1的URIUtil.encodePath发生了什么?
- 如何通过Java中的收据打印机打印支票?
- Spring Boot:从url中删除jsessionid