Java 我是否总是需要为hibernate中的多个关系创建单独的类
我在读这篇文章 但是他创建了三个类Java 我是否总是需要为hibernate中的多个关系创建单独的类,java,hibernate,mapping,Java,Hibernate,Mapping,我在读这篇文章 但是他创建了三个类 Stock Category stock_category 我是否总是需要单独的表来建立关系,或者这可以在两个表中完成,就像只在库存、类别中一样。一般来说,您不能有两个相互具有外键约束的表。此外,每个表中都会有多个几乎重复的行,这将使使用这些行的方式变得复杂,而不涉及多对多关系。您需要一个单独的表来处理多人关系中的连接。但是,您不需要一个单独的Java类来表示这个联接表 在引用文章的代码中,Stock和Category都有Set字段,并用@OneToMan
Stock
Category
stock_category
我是否总是需要单独的表来建立关系,或者这可以在两个表中完成,就像只在库存、类别中一样。一般来说,您不能有两个相互具有外键约束的表。此外,每个表中都会有多个几乎重复的行,这将使使用这些行的方式变得复杂,而不涉及多对多关系。您需要一个单独的表来处理多人关系中的连接。但是,您不需要一个单独的Java类来表示这个联接表 在引用文章的代码中,
Stock
和Category
都有Set
字段,并用@OneToMany
注释映射。您可以使用@manytomy
注释,完全避免使用StackCategory
类。该表仍然必须存在,并将在关系一端的@JoinTable
注释中引用
有关如何执行此操作的详细信息,请参阅。否。永不。
这是我从许多人那里听到的常见问题。答案是,当您设计实体时:您不能从关系(RDBMS)的角度思考,而必须从对象(Java)的角度思考。 更多细节。Hibernate试图完成一项相当困难的任务:将面向对象的Java世界与关系世界连接起来。在大多数情况下,它是以两种范式之间的混淆为代价实现的 最好的策略(也不那么痛苦)是设计实体,让Hibernate为您创建模式。 所以假设
Stock entity refers to many categories (Set of Categories)
and
Category entity has a set of Stock ids
我们有一个可从两个实体导航的多对多关系。你在这里只需要两门课
然后,您需要对这些属性集进行注释(这里我假设您使用的是注释而不是.hbm.xml)(请阅读本文)
编译代码。然后用于自动模式生成(hbm2ddl.auto是启用模式生成的属性)。如果一切顺利
您将在数据库中看到3个表,2个表表示实体,1个表表示多对多关联(这是模式的第三种标准形式,例如最干净的模式)
然后坚持一些实体并享受。在使用hibernate时,千万不要忘记用面向对象的术语思考(没有连接操作) 如果您有多对多关系,您将需要一个连接数据库表,在您的案例中是
Stock\u Category
表。也就是说,连接表可能不需要在中显示为Hibernate实体,这取决于您要完成的任务
如果您的连接表仅包含Stock
表和Category
表中的主键,则可以使用@manytomy
。在这种情况下,股票实体将具有返回所有类别的Stock.getCategories()
,而类别实体将具有返回所有股票的Category.getStocks()
。连接表根本不显示
但是,如果您要在Stock\u Category
表中添加其他行为,例如,如果您想捕获将股票分配给该类别的人或添加股票的时间,则需要使用@OneToMany
和@manytone
而不是@manytomy
。在这种情况下,连接表将显示为Hibernate实体。因此,股票实体将具有返回所有股票类别的Stock.getStockCategories()
,而类别实体也可能具有返回相同内容的Stock.getStockCategories()
(如果配置双向关系)。StockCategory
实体包含其他属性,例如将股票添加到category
或dateAdded
中的人员等
希望这有帮助。所以你的意思是,对于多对多,必须有关系表,我是说三个表是的。即使您绕过了外键约束,否则您的手上仍然会有一个相当不可用的混乱。因此,第三个表将自动生成,或者我已经创建了它。如果hibernate创建了它,那么它的名称是什么hibernate可以自动创建所有需要的表。+1:在联接表中保留其他信息是将其显式映射为实体的一个很好的理由。