Я пытаюсь вставить запись в первичную таблицу и связанную таблицу присоединения с помощью одного вызова метода CrudRepository.save (...), но пока безуспешно.Я использую Oracle и SpringBoot.
Вот мои две сущности:
Sandcastle Entity
@Entity
@Table(schema = "ROGUE", name = "SANDCASTLE")
public class Sandcastle implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name = "sandcastleIdGenerator", schema = "ROGUE", sequenceName = "ROGUE_SEQ_NUM_SEQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sandcastleIdGenerator")
@Column(name = "SANDCASTLE_SEQ_NUM")
private Long id;
// other fields omitted for brevity
@OneToOne(cascade = CascadeType.ALL)
private Waterflow waterflow;
}
Waterflow Entity
@Entity
@Table(schema = "ROGUE", name = "WATERFLOW")
public class Waterflow implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "SANDCASTLE_SEQ_NUM")
private Long id;
// other fields omitted for brevity
@OneToOne(mappedBy = "waterflow")
private Sandcastle sandcastle;
}
Код CrudRepository
выглядит следующим образом:
// populate Waterflow list
final Waterflow waterflow = new Waterflow();
waterflow.setOtherFields(...)
// populate Sandcastle
final Sandcastle sandcastle = new Sandcastle();
sandcastle.setOtherFields(...)
sandcastle.setWaterflow(waterflow);
// insert initial record into the Rogue schema
final Sandcastle sandcastle = this.sandcastleRepository.save();
Теперь, что касается структуры моей базы данных, таблица SANDCASTLE имеет первичный ключ с именем SANDCASTLE_SEQ_NUM наряду с другими столбцами, которыездесь не актуальныИ таблица WATERFLOW имеет внешний ключ к таблице SANDCASTLE, также называемый SANDCASTLE_SEQ_NUM, наряду с другими несоответствующими столбцами;этот столбец также является первичным ключом.По сути, между SANDCASTLE и WATERFLOW существует один-к-одному.Другими словами, вставка в таблицу SANDCASTLE всегда приводит к вставке в таблицу WATERFLOW.Кроме того, в поле идентификатора SANDCASTLE действительно есть последовательность Oracle, которая называется ROGUE_SEQ_NUM_SEQ
.
. Теперь, выполнив описанный выше метод save
, я получаю следующую ошибку:
Caused by: org.hibernate.id.IdentifierGenerationException: ids for this class must be manually assigned before calling save(): com.whatever.something.Waterflow
Несколькодругие вещи, которые я пробовал:
- изменив
GenerationType
с SEQUENCE
на AUTO
, но получил те же IdentifierGenerationException
. - Добавление
@SequenceGenerator
и @GeneratedValue
аннотации к объекту Waterflow, а также (SEQUENCE
и AUTO
);в этом случае я получаю эту ошибку: Caused by: oracle.jdbc.OracleDatabaseException: ORA-02291: integrity constraint (ROGUE.WATERFLOW_FK0) violated parent key not found
Я понимаю, о чем говорят ошибки, но я бы хотел, чтобы Hibernate интеллектуально вставил сгенерированный идентификатор таблицы SANDCASTLE в качестве идентификаторатаблицы WATERFLOW на этом сингле save
.Возможно ли это ... и если да, что мне нужно изменить, чтобы это произошло?