Использование Spring CrudRepository для вставки записи в таблицу соединений «один к одному» с Hibernate - PullRequest
1 голос
/ 23 сентября 2019

Я пытаюсь вставить запись в первичную таблицу и связанную таблицу присоединения с помощью одного вызова метода 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.Возможно ли это ... и если да, что мне нужно изменить, чтобы это произошло?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...