java - ejb3 : mapping many-to-many relationship jointable with a simple primary key

标签 java orm jpa mapping many-to-many

我经常在书中看到,当将多对多关系转换为数据库模式时,JoinTable 会获得一个复合键,该复合键由多对多关系中涉及的表的主键组成。 我尽量避免使用复合键。所以我通常甚至为 JoinTable 创建一个代理键,并允许数据库通过触发器或数据库具有的用于递增主键的任何功能来填充它。这似乎是一种更简单的方法。

我能想到的唯一问题是,在 JoinTable 中有可能出现重复的外键对。但这可以通过在 JoinTable 中插入行之前的简单查询来避免。

由于书籍总是使用复合键方法,我想知道如果我对 JoinTable 使用简单的一列代理键是否有任何负面影响?

最佳答案

在我看来,使用单个主键不是一个好主意。

首先,正如您所说,单个主键不能确保数据库中的唯一性。当然,您可以在运行时使用一个简单的查询来检查这一点,但这代价高昂,而且如果您只忘记执行一次检查查询,您可能会使您的数据库处于不一致状态。

此外,我认为在这种情况下没有必要为主键使用额外的列。您不需要通过唯一的主键来标识关系,因为关系已经由两个唯一的键定义:两个表的主键。在这种情况下,您将拥有不必要的数据,这会增加数据模型的复杂性,并且您可能永远不会使用这些数据。

关于java - ejb3 : mapping many-to-many relationship jointable with a simple primary key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3699678/

相关文章:

java - ArrayIndexOutOfBoundsException 错误

java - 初学者;方法和字符串

java - 如何从 javax.persistence.Query 获取查询字符串?

ruby - DataMapper Redis : can't find child from parent, 只有来自 child 的 parent

java - 创建添加实体时出现异常

java - 删除功能不起作用(java)

java - 如何交换数组中最大的数字和最后一个数字?

hibernate - 为什么 hibernate session.close() 不自动刷新数据?

hibernate - JPA by kotlin : by lazy and @Transient not work with hibernate

java - 如何在jpa存储库中使用jsonb_set来传递动态字符串?