我正在读这篇文章
http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example/
但他创造了三个班级
Stock
Category
stock_category
我是否总是需要单独的关系表,或者这可以在2个表中完成,以及仅在库存,类别
答案 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
实体包含其他属性,例如personWhoAddsTheStockIntoCategory
或dateAdded
等...
希望这有帮助。
答案 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类。
在引用文章的代码中,Stock
和Category
都有Set<StockCategory>
个字段与@OneToMany
注释相映射。您可以使用@ManyToMany
注释来完全避免使用StackCategory
类。该表仍然必须存在,并且将在关系的一端的@JoinTable
注释中引用。
有关如何执行此操作的详细信息,请参阅docs on mapping associations。
答案 3 :(得分:-1)
通常,您不能拥有两个彼此具有外键约束的表。此外,在每个表中最终会出现多个几乎重复的行,这会使用 not 涉及多对多关系的方式使用它们变得复杂。