我在创建新对象时出现 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;
}
}
异常(exception):
错误代码:2291 调用:INSERT INTO CRM_TASKDEPARTUREADDRESS (TASKID, PERSONADDRESSID) VALUES (?, ?) 绑定(bind) => [3299, 1] 引起原因:java.sql.SQLIntegrityConstraintViolationException:ORA-02291:违反完整性约束(DUMMY.FK_CRM_TASKDEPARTUREADDR_TASKI) - 找不到父键
哪里错了? 附注在测试对象中无一异常(exception)地保存...
已更新
我发现 INSERT 生成的序列错误
1.插入父类(super class)Task(右)
2.插入CRM_TaskDepartureAddress(错误)
3.插入CRM_TASKDEPARTURE(错误)
2 和 3 必须交换,因为 CRM_TaskDepartureAddress 引用了 CRM_TASKDEPARTURE 。
已更新
继承类型.JOINED
最佳答案
您不能将 ManyToOne 作为主键;它指出有许多 TaskVisitAddress 实例引用同一个 TaskVisit,而您的 @Id 需要唯一的东西。
您需要在 TaskVisitAddress 上找到一些可以将其与其他 TaskVisitAddress 实例唯一标识的内容,例如通过排序分配的整数 ID。
@JoinColumn(name = "TASKID")
引用任务表中的“TASKID”,因为 JPA 只允许关系引用实体的主键,因此要求首先插入 CRM_TASKDEPARTURE 的约束是不正确的。如果必须保留约束并要求先插入CRM_TASKDEPARTURE,可以尝试在joinColumn中指定表名:
@JoinColumn(name = "TASKID", referencedColumnName = "CRM_TASKDEPARTURE.TASKID")
如功能请求中所述 https://bugs.eclipse.org/bugs/show_bug.cgi?id=333100
关于java - 保存实体集合时未找到 PK(错误??),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341490/