Учитывая мой опыт, вы просто неправильно моделируете свои сущности. Как сказано в другом комментарии, важно знать, какими будут ваши варианты использования. Например, когда вы моделируете Вопрос / Ответ, будет много случаев, когда вы будете использовать свой Вопрос, и только Вопрос, и использовать отношение с Ответом для их отображения. Но при доступе к вопросу из его ответа это вряд ли произойдет ...
Итак, как вы это делаете? Вы слышали понятие Агрегат Root и Объект стоимости? Это довольно легко. Вот как вы можете спроектировать свои отношения Вопрос / Ответ:
- Создайте ответ класса и используйте аннотацию
@Embeddable
. Таким образом, hibernate не будет пытаться создать таблицу для хранения ваших ответов, но вы можете использовать это, чтобы помочь отображению hibernate наилучшим образом.
@Data
@Embeddable
public class Answer {
private String text;
}
Вот и все, это все, что вам нужно для представления объекта значения Answer
.
Создайте свою сущность
Question
со списком
Answers
(обратите внимание, я удалил аннотацию к вашим ограничениям, но не стесняйтесь их использовать):
@Data
@Entity
public class Question {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
private String text;
@ElementCollection(fetch = FetchType.EAGER)
@AttributeOverride(name = "text", column = @Column(name = "answer_text"))
private List<Answer> answers;
}
@ElementCollection(fetch = FetchType.EAGER)
для Hibernate обязательно знать, что ему нужно будет хранить список Answer
, таким образом, создается таблица для хранения бесконечного числа ответов на ваш вопрос. @AttributeOverride(name = "text", column = @Column(name = "answer_text"))
здесь, чтобы сказать Спящий режим: сохраните значение атрибута text
моего Answer
класса и сохраните его в столбце с именем answer_text
.
Что делать дальше? Создайте Controller
и Repository
и попробуйте опубликовать вопрос.
@RestController
public class QuestionController {
@Autowired
private QuestionRepository repository;
@PostMapping("/questions")
public void postQuestion(@RequestBody Question question) {
repository.save(question);
}
@GetMapping("/questions")
public Iterable<Question> questions() {
return repository.findAll();
}
}
public interface QuestionRepository extends CrudRepository<Question, Integer> {}
И, наконец, опубликуйте свой вопрос:
{
"text": "quetion text",
"answers": [{
"text": "answer1"
}, {
"text": "answer2"
}]
}
Это создаст ваш вопрос с его список ответов.
Даже если с плюсами / минусами я перечислю ниже, я все же думаю, что это лучшее решение / компромисс, который вы можете иметь:
Плюсы
- Простота настройки
- Вам не нужно управлять связью между
Question
и Answer
- Когда вы получаете вопрос, это также извлечение соответствующего
Answer
.
Минусы
- Вы не можете изменить конкретный ответ на конкретный c вопрос (но вы когда-нибудь?)
- У вас нет таблицы, отражающей все ответы, которые у вас есть в вашей базе данных (но еще раз, вы когда-нибудь)
Учитывая базовое использование c попробуйте это.
Только чтобы вы поняли, вот таблицы, которые Hibernate создает с помощью этого решения:
Hibernate: создать таблицу q uestion (целое число идентификатора, сгенерированное по умолчанию как идентификатор (начинается с 1), текст varchar (255), первичный ключ (id)) Hibernate: создать таблицу question_answers (целое число question_id не нулевое, answer_text varchar (255))
Всего 2 таблицы, одна вопрос и одна ** question_answers * * ...