Hibernate 当一列(隐式地)引用某个其他表的一部分时,如何映射@ManyToOne’;s化合物PK?
我正在为现有的表编写实体类,我看到有些奇怪的是,表是这样的Hibernate 当一列(隐式地)引用某个其他表的一部分时,如何映射@ManyToOne’;s化合物PK?,hibernate,jpa,many-to-one,composite-primary-key,Hibernate,Jpa,Many To One,Composite Primary Key,我正在为现有的表编写实体类,我看到有些奇怪的是,表是这样的 parent表定义了一些带有类别的代码 parent ---- category VARCHAR PK code VARCHAR PK 子表有一列,其值等于父表的代码列。 请注意,没有用于此的FK child ----- code VARCHAR - no FK for parent/category 我怀疑表设计器依赖web UI来实现完整性 说 @实体 班童{ 静态最终字符串隐式_CATEGORY=“b”; //
parent
表定义了一些带有类别的代码
parent
----
category VARCHAR PK
code VARCHAR PK
子表有一列,其值等于父表的代码列。
请注意,没有用于此的FK
child
-----
code VARCHAR - no FK for parent/category
我怀疑表设计器依赖web UI来实现完整性
说
@实体
班童{
静态最终字符串隐式_CATEGORY=“b”;
//@列(name=“code”);
//私有字符串代码;//当然可以。
@许多酮
private Parent;//我可以这样做吗?
}
如何在
Some
实体类中执行@ManyToOne
?甚至可能吗?代码“x”在父表中是否唯一?如果不是,看起来设计更像是多对多,一个孩子可以和许多父母联系在一起。如果它是唯一的,那么看起来可能是表设计者犯了一个错误,可能只是使用了代码作为唯一的pk;您当然可以在父实体中将其标记为您的ID——它不必与数据库完全匹配,它只是有帮助。你可以有一个复合pk,然后子代只引用代码,但这在JPA中是不允许的(它破坏了缓存),但将与提供者一起工作-你必须查看他们的文档以了解更多信息support@Chris谢谢你的评论。否parent
表中的code
列不是唯一的。我同意这是(另一)个问题。表设计者的错误是,他或她决定子表的code
列可能映射父行,其类别
列是特定的。比如说,通过Web UI,通过MyBatis的SQL。您必须使用基本映射来映射child.code字段以设置您自己(如果执行修改),但您可以将其映射为一个指定联接列(insertable/updateable=false)的OneToMany,从父级代码映射到子级代码。如果希望父表有子表,只需在另一端执行相同的操作,即设置一个只读联接列,将子表代码标记为父表代码的外键。Hibernate将有办法绕过JPA验证,因为根本没有引用完整的PK-我不太清楚,无法给出完整的答案。代码“x”在父表中是唯一的吗?如果不是,看起来设计更像是多对多,一个孩子可以和许多父母联系在一起。如果它是唯一的,那么看起来可能是表设计者犯了一个错误,可能只是使用了代码作为唯一的pk;您当然可以在父实体中将其标记为您的ID——它不必与数据库完全匹配,它只是有帮助。你可以有一个复合pk,然后子代只引用代码,但这在JPA中是不允许的(它破坏了缓存),但将与提供者一起工作-你必须查看他们的文档以了解更多信息support@Chris谢谢你的评论。否parent
表中的code
列不是唯一的。我同意这是(另一)个问题。表设计者的错误是,他或她决定子表的code
列可能映射父行,其类别
列是特定的。比如说,通过Web UI,通过MyBatis的SQL。您必须使用基本映射来映射child.code字段以设置您自己(如果执行修改),但您可以将其映射为一个指定联接列(insertable/updateable=false)的OneToMany,从父级代码映射到子级代码。如果希望父表有子表,只需在另一端执行相同的操作,即设置一个只读联接列,将子表代码标记为父表代码的外键。Hibernate将有办法绕过JPA验证,因为完整的PK根本没有被引用——我不太清楚,无法给出完整的答案。
parent table
category code
-------------
'a' 'c'
'b' 'x'
'b' 'y'
child table << this table is supposed to use 'b' category.
code
-------------
'x' // implicitly refer 'b' - 'x'
'y' // implicitly refer 'b' - 'y'