Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我是否总是需要为hibernate中的多个关系创建单独的类_Java_Hibernate_Mapping - Fatal编程技术网

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:在联接表中保留其他信息是将其显式映射为实体的一个很好的理由。