Hibernate hbm 多对多映射
Posted
技术标签:
【中文标题】Hibernate hbm 多对多映射【英文标题】:Hibernate hbm many to many mapping 【发布时间】:2012-05-30 16:19:38 【问题描述】:我正在尝试在 2 个对象之间创建一对多映射(使用 Java)。我能够将对象保存在数据库中,但不能保存它们的关系。我有一个名为“AuthorizationPrincipal”的类,它包含一组“权限”
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="org.openmrs">
<class name="AuthorizationPrincipal" table="authorization_principal" lazy="false">
<id
name="authorizationPrincipalId"
type="int"
column="authorization_principal_id"
unsaved-value="0"
>
<generator class="native" />
</id>
<discriminator column="authorization_principal_id" insert="false" />
<property name="name" type="java.lang.String" column="name" unique="true"
length="38"/>
<many-to-one
name="creator"
class="org.openmrs.User"
not-null="true"
/>
<property
name="uuid"
type="java.lang.String"
column="uuid"
length="38"
unique="true"
/>
<property
name="dateCreated"
type="java.util.Date"
column="date_created"
not-null="true"
length="19"
/>
<property
name="policy"
type="java.lang.String"
column="policy"
not-null="true"
length="255"
/>
<!-- Associations -->
<set name="privileges" inverse="true" cascade=""
table="authorization_principal_privilege" >
<key column="authorization_principal_id" not-null="true"/>
<many-to-many class="Privilege">
<column name="privilege" not-null="true" />
</many-to-many>
</set>
</class>
我通过一些教程和示例想出了“set”标签,但它仍然不会保存在数据库中。
【问题讨论】:
【参考方案1】:我看到的第一件事是错误的,您将关系定义为来自 AuthorizationPrincipal 实体的 多对多,并且正如您在问题中所说,您想要一个一对多的关系。
然后,你必须像这样定义你的集合:
<set name="privileges" inverse="true" cascade="all,delete-orphan">
<key column="authorization_principal_id" not-null="true" />
<one-to-many class="Privileges" />
</set>
这个配置应该够你用了。
编辑
如果你的配置是多对多的,那么你必须有一个AuthoririzationPrincipal和Privileges之间关系的表,比如AuthoririzationPrincipal-Privileges
而ypur映射必须是这样的:
在 AuthorizationPrincipal 中:
<set name="privileges" table="AuthoririzationPrincipal-Privileges">
<key column="authorization_principal_id" />
<many-to-many class="Privileges" column="privileges_id" />
</set>
在特权中:
<set name="authorizationPrincipals" inverse="true" table="AuthoririzationPrincipal-Privileges">
<key column="privileges_id" />
<many-to-many class="AuthoririzationPrincipal" column="authorization_principal_id" />
</set>
【讨论】:
我想我可能犯了一个错误。我可能需要多对多而不是一对多。对象“AuthorizationPrincipal”包含一组“Privilege”对象。 “Privilege”对象的一个实例可以包含在多个“AuthorizationPrincipal”对象中。前任。 AP1 可以包含 priv1 和 priv2,然后 AP2 可以包含 priv2 和 priv3。 谢谢,问题已解决。这实际上是事务管理器的问题。以上是关于Hibernate hbm 多对多映射的主要内容,如果未能解决你的问题,请参考以下文章