Java 具有单个映射表的多个关系,无需通过Hibernate生成外键
我有两个基本抽象类,从这两个类派生出多个附加类,添加附加属性等 这些特定的派生类型之间存在关系 一个简单的示例:Java 具有单个映射表的多个关系,无需通过Hibernate生成外键,java,hibernate,many-to-many,one-to-one,many-to-one,Java,Hibernate,Many To Many,One To One,Many To One,我有两个基本抽象类,从这两个类派生出多个附加类,添加附加属性等 这些特定的派生类型之间存在关系 一个简单的示例: 角色和组类是抽象,但它们没有标记为@MappedSuperclass InheritanceType.JOINED策略正在使用,因此两个表Role(对于抽象类)和AdminRole(对于派生类)都应该存在(它们都将具有相同的RoleID) DiscussionGroup有一个AdminRole属性,一个 集合,一个集合 工作组有集合,集合 由于派生类的数量可能会增加,并且从角色派
角色
和组
类是抽象
,但它们没有标记为@MappedSuperclass
InheritanceType.JOINED
策略正在使用,因此两个表Role
(对于抽象类)和AdminRole
(对于派生类)都应该存在(它们都将具有相同的RoleID
)
有一个DiscussionGroup
属性,一个AdminRole
,一个集合
集合
有工作组
,集合
集合
Role_Group (RoleID, GroupId)
在当前的开发过程中,我们使用Hibernate生成DDL模式(hbm2ddl.auto=create)(我们将使用静态模式定义供以后的生产使用)。Hibernate会自动为关系创建外键,这对我们来说非常好
如果我指示它使用相同的映射表进行连接(对于多对多、多对多以及一对一),它也会尝试创建外键。当然,在RoleID
上从Role\u Group
到AdminRole
和discussantore
同时创建外键是不可能的,所以我得到了一个错误
有没有办法,如何指导休眠
我认为应该保留多个表,它只是映射类中存在的关系
如果您不希望这样,那么您可以在抽象
组中定义集
,在抽象角色中定义集
。您将不会有任何“子集”在子类中,您只需使用正确类型的适当元素填充抽象类中的集合。然后,自动映射将为您提供所需的单个联接表。以下是我对第2个问题的回答:
@ForeignKey( name = "none" )
没有为关系生成外键
@Cascade( value = { CascadeType.ALL } )
@OneToOne( fetch = FetchType.EAGER, orphanRemoval = true )
@JoinTable( name = "Role_Group",
inverseJoinColumns = { @JoinColumn( referencedColumnName = "rolleId", name = "RolleID" ) },
joinColumns = { @JoinColumn( referencedColumnName = "groupId", name = "GroupID" ) } )
@ForeignKey( name = "none" )
public AdminRole getAdmin()
资料来源:
根据来源,这是一个未记录的特性,在发行说明中可以看到:
Changes in version 2.1.9 (xx.x.xxxx)
------------------------------------
* TimesTenDialect now supported (look at TimesTenDialect for certain limitations)
* foreign-key="none" can be used to disable generation of a foreign key.
在xml配置中-您可以这样使用它
<many-to-one name="Hospital" column="hospitalId" property-ref="hospitalId" update="false" insert="false" foreign-key="none">
如中所述(请参阅页面来源-页面上未显示xml配置)
注意:
但是,这并不能解决整个问题。Hibernate无法通过getAdmin
和getManagers
的映射表获得正确的数据,因为它查找Role\u Group
,为DiscussionGroup
GroupID
找到RoleIDs
,并且不知道它是否为AdminRole
或ManagerRole
并给出“不存在具有给定标识符的行”错误
然而,类似的映射可以工作,当我在Group或DiscussionGroup中使用诸如public Set getRoles()
这样的表时,Hibernate将成功地将派生类(AdminRole
,ManagerRole
)加载到集合中
<many-to-one name="Hospital" column="hospitalId" property-ref="hospitalId" update="false" insert="false" foreign-key="none">