Как трудно, очень субъективно, но я надеюсь, что смогу помочь :) Я постараюсь ответить на все ваши вопросы ...
1) Похоже, вы уже поняли больше, чем основы и соединили Spring, Java, Hibernate и MySQL вместе.
Аннотация @OneToMany
может быть необязательной, но это зависит от того, как вы моделируете отношения между вашими концепциями. @OneToMany
используется на уровне свойств и может быть двунаправленным, однонаправленным или однонаправленным с таблицей соединений. Это важное различие, которое можно исследовать дальше, но сейчас давайте просто перейдем к самому простому (на мой взгляд) варианту - двунаправленному. Он используется для описания отношений между сущностями (в данном случае POJO).
Пример моделируемой взаимосвязи: « один вопрос переполнения стека содержит много комментариев», обратное значение которого равно « много комментариев, принадлежащих один вопрос переполнения стека "и, следовательно, это аннотировано @ManyToOne
. Обратите внимание, что только сторона «владеет» отношением, и атрибут mappedBy
должен использоваться для указания члена в классе, которому принадлежит отношение.
@Entity
@Table(name = "question")
public class StackOverflowQuestion {
@Column(name = "the_question")
private String question_text;
public String getQuestionText() { return question_text; }
@OneToMany(mappedBy="comment_text")
private List<Comment> comments = new Vector<Comment>();
public List<Comment> getComments() { return comments; }
}
@Entity
@Table(name = "comment")
public class Comment {
@Column(name = "the_comment")
private String comment_text;
public String getComment() { return comment_text; }
@ManyToOne
private StackOverflowQuestion question;
public Job getStackOverflowQuestion () { return question; }
}
Это переведет в базу данных таблицы вопрос и комментарий .
вопрос имеет 1 столбец - the_question
комментарий имеет 2 столбца - the_comment и question_question_text
Второй столбец - это столбец соединения , автоматически создаваемый hibernate для поддержания соответствия между вопросами и комментариями, и по умолчанию ему присваивается имя:
"объединение имени
отношения на стороне владельца, _
(подчеркивание) и название
столбец первичного ключа на стороне владельца. "
с здесь
Таким образом, если в таблице question есть аннотированный столбец @Id
, в котором каждому вопросу присваивается уникальный числовой (например, идентификатор), то будет создан столбец соединения с именем question_id .
Вы можете добавить следующее в класс StackOverflowQuestion:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
public Long getId() { ... }
В любом случае в каждой строке базы данных comment сохраняются некоторые дополнительные данные (question_id), что делает возможным получение "комментариев к заданному вопросу". Обратите внимание, что вы можете переопределить автоматическое создание имени с помощью аннотации @JoinColumn
.
Вам также необходимо выяснить, что происходит, когда экземпляры этих классов сохраняются в спящем режиме, в частности, как обновляется столбец соединения. Например, после того, как вопрос создан и ему дан Id (т. Е. Он сохранен / сохранен), для каждого комментария по этому вопросу необходимо задать значение question_id в экземпляре Comment, прежде чем оно будет сохранено. ,
2) Вы бы использовали @Embeddable
(и его аналог @Embedded
), если связь между данными не требует отдельной таблицы. Вот хороший пример здесь того времени, когда это может понадобиться.
3) Обычный JDBC потребует от вас написания большего количества SQL самостоятельно, поскольку ни в одном из приведенных выше примеров не требовался SQL для CRUD. Есть много сайтов, которые объясняют плюсы и минусы простого JDBC против спящего, и есть ситуации, когда простой JDBC может быть лучшим решением.
Я бы продолжил переход в режим гибернации, так как это может привести к менее сложному решению, почти без рукописного SQL и прочной связи между объектами Java и базой данных без дублирования логики в базе данных и классе Java. (Хотя некоторые могут утверждать, что это недостатки!). Лично мне нравятся аннотации в спящем режиме, поскольку они позволяют мне создавать набор POJO в отношениях, из которых автоматически создается моя база данных.
Надеюсь, это поможет. Уже поздно, я устал и у меня не было возможности протестировать код примера:)