使用HIbernate注释制作购物车有多难

时间:2011-03-02 18:03:21

标签: hibernate spring-mvc shopping-cart hibernate-annotations

我正在学习spring mvc和hibernate。

我刚刚使用hibernate注释和mysql完成了CRUD操作的简单站点。现在我必须建立购物车网站,我不知道我该怎么办。

我对@onetomany,@ Embeddable @id注释感到困惑,而且很多类。有没有人用hibernate注释完成它

或者我应该选择普通的JDBC,我不知道如何从它开始

1 个答案:

答案 0 :(得分:2)

有多难,非常主观,但我希望我能帮忙:)我会尽力回答你所有的问题......

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自动创建的join column,用于维护问题和注释之间的映射,默认情况下,名称为:

  

“串联的名称   在业主方面的关系,_   (下划线),以及   拥有方的主键列。“

来自here

因此,如果问题表上有一个@Id注释列,为每个问题提供一个唯一的数字(例如)标识符,那么将使用名称<创建连接列强> question_id

您可以将以下内容添加到StackOverflowQuestion类:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false)
    private Long id;
    public Long getId() { ... }

在任何一种情况下,每个评论数据库行都有一些额外的数据(问题ID),这使得检索“给定问题的评论”成为可能。请注意,您可以使用@JoinColumn注释覆盖自动名称生成。

您还需要了解hibernate持久保存这些类的实例时会发生什么,特别是连接列的更新方式。例如,一旦创建了一个问题并给出了 Id (即它被持久化/保存),那么该问题的每个评论都需要在评论实例上的question_id 设置之前坚持下去。

2)如果数据之间的关系不保证单独的表,您将使用@Embeddable(及其对应的@Embedded)。可能需要的时候有一个很好的例子here

3)普通JDBC将要求您自己编写更多SQL,因为上述示例都没有为CRUD要求任何SQL。有许多站点可以解释普通JDBC与hibernate的优缺点,并且有些情况下普通JDBC可能是更好的解决方案。

我会继续使用hibernate,因为它可以导致一个不那么复杂的解决方案,几乎没有手工编写的SQL和Java对象与数据库之间的可靠链接,而不会在数据库和Java类上重复逻辑。 (虽然有些人可能会说这些都是缺点!)。就个人而言,我喜欢hibernate注释,因为它允许我在一个自动创建数据库的关系中创建一组POJO。

我希望这会有所帮助。已经很晚了,我累了,我没有机会测试示例代码:)