2014-01-21 2 views
1

Облицовка проблемы с вставкой объекта в базу данных. Я использую Hibernate JPA.Нарушение целостности нарушено - родительский ключ не найден - OneToOne и ManyToOne

У меня есть таблицы Напоминание и напоминание и каждое напоминание будут содержать текущий статус ReminderAction (то есть 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, зимуют получает последовательность для напоминания и ReminderAction из БД

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

Но во флеш() спящий режим пытается вставить ReminderAction первый и из-за ReminderID в ReminderAction равна нулю его бросок ORA-02291: нарушение целостности (REMINDER_ACTION_FK) нарушено - родительский ключ не найден

Ниже приведены темы и проблемы em из-за триггера в БД. Но у меня нет триггеров для таблицы напоминаний и напоминаний в базе данных.

  1. JPA Bidirectional One to Many Foreign Key Issues

  2. Integrity constraint violated just when I commit the transaction

  3. Hibernate: Insert issue - Parent Key not found

Как я могу попросить зимуют вставить напоминание первый затем ReminderAction?

UPDATE:

Я пытался путем удаления SequenceGenerator от напоминания и ReminderAction и вручную установить идентификаторы во время saveOrUpdate и в конечном итоге с тем же исключением

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 

Любая помощь высоко ценится. Благодарю.

ответ

0

Я вытягивать свой ответ из вопроса, и положить его в специальный ответ:

Сделать ReminderAction в напоминании, как обнуляемые = истина и напоминание в ReminderAction, как обнуляемые = ложь

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

Doing этот спящий режим вставляет Reminder сначала, а затем ReminderAction. Спасибо

Смежные вопросы