保存实体集合时找不到PK(bug ??)

时间:2015-10-26 08:36:51

标签: java jpa orm eclipselink

创建新对象时我有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;
 }
}

Connstraint是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(?,?)     bind =&gt; [3299,1] 引起:java.sql.SQLIntegrityConstraintViolationException:ORA-02291:违反了完整性约束(DUMMY.FK_CRM_TASKDEPARTUREADDR_TASKI) - 找不到父密钥

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

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

1 个答案:

答案 0 :(得分:1)

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

您需要在TaskVisitAddress上找到一些可以从其他TaskVisitAddress实例中唯一标识它的内容,例如通过排序分配的Integer id。

@JoinColumn(name = "TASKID")指的是&#34; TASKID&#34;在任务表中,由于JPA仅允许关系引用实体的主键,因此要求首先插入CRM_TASKDEPARTURE的约束是不正确的。如果必须保留约束并要求首先插入CRM_TASKDEPARTURE,则可以尝试在joinColumn中指定表名:

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

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