【问题标题】:PK not found while saving collection of entities (bug ??)保存实体集合时未找到 PK(错误 ??)
【发布时间】:2015-10-26 08:36:51
【问题描述】:

我在创建新对象时遇到 ORA-02291 (entitymanager.persist(taskVisit))

@Entity(name = "CRM_TASKDEPARTURE")
@Access(AccessType.PROPERTY)
@DiscriminatorValue(value = TaskType.Consts.VISIT_ID)
public class TaskVisit extends Task {
private static final long serialVersionUID = 1L;

private List<TaskVisitAddress> addresses = new ArrayList();

public TaskVisit() { }


@OneToMany(fetch = FetchType.LAZY,cascade = CascadeType.PERSIST,mappedBy = "taskVisit")
public List<TaskVisitAddress> getAddresses() {
    return addresses;
 }
}

约束是 CRM_TaskVisitAddress(TASKID)

实体代码:

@Entity(name = "CRM_TaskDepartureAddress")
public class TaskVisitAddress implements Serializable {
...any fields 
@Id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "TASKID")
public TaskVisit getTaskVisit() {
    return taskVisit;
 }
@Id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PERSONADDRESSID")
public PersonAddress getPersonAddress() {
    return personAddress;
}
}

例外:

错误代码:2291 调用:INSERT INTO CRM_TASKDEPARTUREADDRESS (TASKID, PERSONADDRESSID) VALUES (?, ?) 绑定 => [3299, 1] 原因:java.sql.SQLIntegrityConstraintViolationException: ORA-02291: 违反完整性约束 (DUMMY.FK_CRM_TASKDEPARTUREADDR_TASKI) - 未找到父键

错在哪里? 附:在测试对象中无一例外地保存...

更新
我发现错误的 INSERT 生成序列
1.插入超类Task(右)
2. 插入 CRM_TaskDepartureAddress(错误)
3.插入CRM_TASKDEPARTURE(错误)
№ 2 和 3 必须交换,因为 CRM_TaskDepartureAddress 引用了 CRM_TASKDEPARTURE 。 更新
InheritanceType.JOINED

【问题讨论】:

  • 为什么不分享完整的异常、堆栈跟踪以及“ORA-blahblah”的含义?
  • 这是单表还是联表继承?

标签: java jpa orm eclipselink


【解决方案1】:

您不能将 ManyToOne 作为主键;它说明有许多 TaskVisitAddress 实例引用相同的 TaskVisit,而您的 @Id 需要一些独特的东西。

您需要在您的 TaskVisitAddress 上找到可以与其他 TaskVisitAddress 实例唯一标识的内容,例如通过排序分配的整数 id。

@JoinColumn(name = "TASKID") 指的是 Task 表中的“TASKID”,因为 JPA 只允许关系引用实体的主键,使得需要首先插入 CRM_TASKDEPARTURE 的约束是不正确的。如果一定要保持约束,需要先插入CRM_TASKDEPARTURE,可以尝试在joinColumn中指定表名:

  @JoinColumn(name = "TASKID", referencedColumnName = "CRM_TASKDEPARTURE.TASKID")

如功能请求中所述 https://bugs.eclipse.org/bugs/show_bug.cgi?id=333100

【讨论】:

  • TaskVisitAddress 具有复合 ID
  • 帮助展示它。是否有另一个具有相同复合 PK 的 TaskVisitAddress?如果是这样,要么您没有正确更新复合值,要么您应该合并您的实体而不是调用persist。 Persist 仅适用于新实体实例,如果已存在则预计会抛出异常
  • 我的问题只有新对象
  • JPA 只允许引用实体的主键,在这种情况下,主键在任务表中。引用 Task 子类的所有内容都应使用 Task ID,因此 CRM_TaskDepartureAddress 的约束(和外键)应引用正确插入的 Task 行,而不是 CRM_TASKDEPARTURE 表。
  • @Chis 期望 Task 类有 5 个子类,只有 TaskDeparture =(
猜你喜欢
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多