我正在学习spring mvc和hibernate。
我刚刚完成了使用休眠注释和 mysql 进行 CRUD 操作的简单站点。现在我必须建立购物车网站,我不知道我应该如何进行。
我对 @onetomany 、 @Embeddable @id 注释以及太多类感到困惑。有没有人用休眠注释完成它
或者我应该选择普通的 JDBC,我不知道如何开始
我正在学习spring mvc和hibernate。
我刚刚完成了使用休眠注释和 mysql 进行 CRUD 操作的简单站点。现在我必须建立购物车网站,我不知道我应该如何进行。
我对 @onetomany 、 @Embeddable @id 注释以及太多类感到困惑。有没有人用休眠注释完成它
或者我应该选择普通的 JDBC,我不知道如何开始
事情有多难,是非常主观的,但我希望我能提供帮助:) 我会尝试回答你所有的问题......
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 自动创建的连接列,用于维护问题和评论之间的映射,默认情况下,名称为:
“所有者方的关系名称、_(下划线)和拥有方的主键列名称的串联。”
从这里
因此,如果问题@Id
表上有一个带注释的列,为每个问题提供一个唯一的数字(例如)标识符,那么将使用名称question_id创建连接列。
您可以将以下内容添加到 StackOverflowQuestion 类:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", updatable = false, nullable = false)
private Long id;
public Long getId() { ... }
在任何一种情况下,每个评论数据库行都有一些额外的数据持久保存(question_id),这使得检索“给定问题的评论”成为可能。请注意,您可以使用注释覆盖自动名称生成@JoinColumn
。
您还需要研究当这些类的实例被休眠时会发生什么,特别是如何更新连接列。例如,一旦创建了一个问题并给出了一个ID (即它被持久化/保存),那么该问题上的每个评论都需要在评论实例上设置question_id才能持久化。
2)如果数据之间的关系不保证单独的表,您将使用@Embeddable
(及其对应物)。这里@Embedded
有一个很好的例子,说明何时可能需要这样做。
3) 纯 JDBC 将要求您自己编写更多 SQL,因为上述示例都不需要任何 SQL 用于 CRUD。有许多网站解释了纯 JDBC 与休眠的优缺点,并且在某些情况下纯 JDBC 可能是更好的解决方案。
我会继续使用 hibernate,因为它可以产生一个不太复杂的解决方案,几乎不需要手写 SQL,并且 Java 对象和数据库之间没有重复的逻辑数据库和 Java 类之间的可靠链接。(尽管有些人可能会争辩说这些是缺点!)。就个人而言,我喜欢 hibernate 注释,因为它允许我在关系中创建一组 POJO,从这些关系中自动创建我的数据库。
我希望这有帮助。已经很晚了,我累了,我没有机会测试示例代码:)