当前位置: 首页 > 知识库问答 >
问题:

违反完整性约束-未找到父密钥-OneToOne和ManyToOne

高嘉树
2023-03-14

将实体插入数据库时遇到问题。我正在使用HibernateJPA。

我有表提醒和提醒行动和每个提醒将保持当前状态的提醒行动(即。OneToOne)和交易结束每个提醒将有许多提醒操作(具有不同的状态)。

DB Table columns are

REMINDER --> REMINDER_ID (PK), CURRENT_ACTION_ID (FK)...
REMINDER_ACTION --> REMINDER_ACTION_ID (PK), REMINDER_ID (FK)...


Reminder Entity
---------------------

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "REMINDER_SEQ_STORE")
@Column(name = "REMINDER_ID", unique = true, nullable = false, precision = 22, scale = 0)
public Integer getReminderId() {
return reminderId;
}



@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = ReminderAction.class)
@JoinColumn(name = "CURRENT_ACTION_ID")
public ReminderAction getCurrentAction() {
return currentAction;
}


ReminderAction Entity
---------------------

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="REMINDER_ACTION_SEQ_STORE")
@Column(name = "REMINDER_ACTION_ID", unique = true, nullable = false)
public Integer getReminderActionId() {
return reminderActionId;
}


@ManyToOne(cascade=CascadeType.ALL,targetEntity=Reminder.class)
@JoinColumn(name="REMINDER_ID")
public Reminder getReminder() {
return reminder;
}


DAO
---

public void saveOrUpdate(final E transientObject) {
getCurrentSession().saveOrUpdate(transientObject);
getCurrentSession().flush();
}

在saveOrUpdate期间,hibernate从DB获取提醒和提醒操作的顺序

Hibernate: select REMINDER_SEQ.nextval from dual
Hibernate: select REMINDER_ACTION_SEQ.nextval from dual

但是在flush()期间,Hibernate尝试首先插入ReminderAction,并且由于ReminderAction中的ReminderID无效,因此抛出ORA-02291:违反了完整性约束(REMINDER_ACTION_FK)-未找到父密钥

下面引用线程和问题,因为在DB中触发。但是我没有任何触发提醒和Reminder_ActionDB表。

>

提交事务时违反了完整性约束

Hibernate:插入问题-未找到父密钥

如何让hibernate先插入提醒,然后再插入提醒动作?

更新:

我试图从提醒和提醒行动中删除序列发生器,并在保存或更新期间手动设置ID,最终以相同的异常结束

Reminder rem = (Reminder)transientObject;
rem.getCurrentAction().setReminderId(5);
rem.getCurrentAction().setReminderActionId(5);
rem.setReminderId(5);

getCurrentSession().saveOrUpdate(transientObject);
getCurrentSession().flush();



Hibernate: insert into REMINDER_ACTION (REMINDER_ID, REMINDER_ACTION_ID) values (?, ?)
binding parameter [1] as [INTEGER] - 5
binding parameter [2] as [INTEGER] - 5
SQL Error: 2291, SQLState: 23000
ORA-02291: integrity constraint (REMINDER_ACTION_FK) violated - parent key not found

非常感谢您的帮助。谢谢

共有1个答案

狄令
2023-03-14

我把你的答案从问题中拉出来,并把它放在一个专门的答案中:

将ReminderAction中的ReminderAction设置为nullable=true,并将ReminderAction中的ReminderAction设置为nullable=false

Reminder Entity
---------------

@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, targetEntity = ReminderAction.class)
@JoinColumn(name = "CURRENT_ACTION_ID", nullable=true)
public ReminderAction getCurrentAction() {
return currentAction;
}

ReminderAction Entity
---------------------
@ManyToOne(cascade=CascadeType.ALL,targetEntity=Reminder.class)
@JoinColumn(name="REMINDER_ID", nullable=false)
public Reminder getReminder() {
return reminder;
}

执行此Hibernate操作将首先插入提醒,然后插入提醒动作。谢谢

 类似资料:
  • 我得到了“完整性约束(SYSTEM。FK_FACILITY)违反了父密钥未找到”错误,尽管主键在上一个表中已经明确定义。 我的确切错误是 我只想将值添加到表中,但我无法这样做。。。如果有人能帮我,那就太好了!

  • SQL数据库代码: 大家好!我做了一系列的桌子,我想我做的每件事都是正确的。除了位置表之外,我在所有表上输入了输入值,没有任何问题。 这就是给我的错误。 第1行错误:ORA-02291:违反完整性约束(ASSIGNMENT.FK_TENANT)-未找到父密钥。 任何帮助和提示将不胜感激。谢谢! 固定的

  • 所以这里是我的数据库: 插入表格: 批次表不断出现的错误是:ORA-02290:违反了检查约束(EJAY.batches\u DATE\u CHK) 学生表出现的错误是:ORA-02291:违反完整性约束-未找到父键 我感到困惑的是,它只显示在表格中的一些行。教职员工和课程都很好,只有这两个。如果答案很明显,我道歉,我是初学者。请帮帮忙

  • 有人能帮我吗?我已经创建了我所有的表和insert语句,但是我得到了这个错误。 这是我试图将数据插入的表: 这是我的插入声明: 错误: “违反了完整性约束(%s.%s)-未找到父项”(SQL Developer) 完整性约束(MS166.FK_SPECIES_ID)被侵犯-未找到父密钥(SQLPlus) 先谢谢你。

  • 当我做插入它给我这个错误: ORA-02291:违反完整性约束(H00300581.FK_类)-未找到父密钥 对于注册表中的所有插入,都会发生此错误。我需要帮忙,请帮我修一下。 是否来自表中的外键?可能是因为我什么都试过了,但都没用。 创建表 创建序列 培训师数据 类数据 成员数据 注册资料

  • 当我创建表时,我将作为主键,将作为外键从同一个表中创建,作为dep表中的外键,当我想插入显示的值时,现在我感到困惑。 该表包含以下内容: 我第一次使用以下命令行: 然后我尝试不使用,如下所示: