java - 保存实体集合时未找到 PK(错误??)

标签 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;
 }
}

约束是 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/

相关文章:

jpa - 保存辅助实体时如何保持 oneToOne 关系

hibernate - org.hibernate.MappingException : Could not determine type for: java. util.Set,在表 : USERS, 的列 : [org. hibernate.mapping.Column(invoices)]

orm - DDD : the Repository contract

python - django orm : retrieve object and check if it has a relation in one query

.net - .NET 世界中的 ORM 和 SOA

java - jsr354-api 和 jsr354-ri 有什么区别

java - Vertx for Java 中的依赖注入(inject)/ORM

JPA 查询选择 "IN"子句中的多个值

java - 使用 @Builder(toBuilder = true) 而不是 setter 会产生开销吗?

java - 在 SQL (SQLite Android) 中更新多个列(具有不同的主键)