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