我总是需要为hibernate中的manymanmany关系创建单独的类

时间:2011-03-05 13:15:25

标签: java hibernate mapping

我正在读这篇文章

http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example/

但他创造了三个班级

Stock
Category
stock_category

我是否总是需要单独的关系表,或者这可以在2个表中完成,以及仅在库存,类别

4 个答案:

答案 0 :(得分:4)

你有多对多的关系,你需要一个联结数据库表,在你的案例Stock_Category表中。也就是说,根据您要完成的任务,该联结表可能不需要显示为Hibernate实体。

如果您的联结表仅包含Stock表和Category表中的主键,则可以使用@ManyToMany。在这种情况下,Stock实体将stock.getCategories()返回所有类别,而Category实体将category.getStocks()返回所有股票。联结表根本没有出现。

但是,如果您要在Stock_Category表中添加其他行为,例如,如果您想捕获谁将该股票分配给该类别或添加该类别,那么您将需要使用@OneToMany@ManyToOne代替@ManyToMany。在这种情况下,联结表将显示为Hibernate实体。因此,Stock实体将stock.getStockCategories()返回所有股票类别,而Category实体也可能stock.getStockCategories()(如果您配置双向关系)返回相同的事物。 StockCategory实体包含其他属性,例如personWhoAddsTheStockIntoCategorydateAdded等...

希望这有帮助。

答案 1 :(得分:2)

没有。决不。 这是我从许多人那里听到的常见问题。答案是,当你设计实体时:

你不能从关系(RDBMS)的角度思考,但你必须考虑对象(Java)

更多细节。 Hibernate试图完成一项非常困难的任务:将面向对象的Java Universe与Relational World连接起来。它在大多数情况下以两种范式之间的混淆价格实现了它。

最好的策略(并且不那么痛苦)是设计你的实体并让Hibernate为你创建架构。 所以假设

Stock entity refers to many categories (Set of Categories)
and
Category entity has a set of Stock ids

我们有两个实体可导航的多对多关系。 此处只需要两个课程

然后你需要注释(这里我假设你使用注释而不是.hbm.xml)这些集合作为多对多属性(阅读Hibernate Annotation Manual)。

编译代码。然后Configure Hibernate用于自动模式生成(hbm2ddl.auto是启用模式生成的属性)。如果一切都好 您将在数据库中看到 3 表2个表中的实体和1个用于多对多关联的表(这是模式的第3范式,例如最干净的表格)。

然后坚持一些实体并享受。并且永远不要忘记在使用休眠时(在没有JOIN操作的情况下)以OO术语思考

答案 2 :(得分:0)

你需要一个单独的表来进行人与人的关系。但是,您不需要表示此连接表的单独Java类。

在引用文章的代码中,StockCategory都有Set<StockCategory>个字段与@OneToMany注释相映射。您可以使用@ManyToMany注释来完全避免使用StackCategory类。该表仍然必须存在,并且将在关系的一端的@JoinTable注释中引用。

有关如何执行此操作的详细信息,请参阅docs on mapping associations

答案 3 :(得分:-1)

通常,您不能拥有两个彼此具有外键约束的表。此外,在每个表中最终会出现多个几乎重复的行,这会使用 not 涉及多对多关系的方式使用它们变得复杂。