【问题标题】:Hibernate Mapping same Column twice休眠映射同一列两次
【发布时间】:2011-09-28 02:31:24
【问题描述】:

如何解决这个问题

实体映射中的重复列:com.abc.domain.PersonConnect 列:PERSON_ID(应该用 insert="false" 映射 更新=“假”)

这是我的 hbm 文件中的 sn-p

<class name="com.abc.domain.PersonConnect" table="PERSON_CONNECT">    
    <composite-id>
        <key-many-to-one name="Parent" class="com.abc.domain.Person" column="PARENT_PERSON_ID"/>
        <key-many-to-one name="Child" class="com.abc.domain.Person" column="CHILD_PERSON_ID"/>
    </composite-id>

    <many-to-one class="com.abc.domain.Person" fetch="select" name="parent" lazy="false" > 
        <column length="20" name="PERSON_ID" not-null="true"/> 
    </many-to-one> 
    <many-to-one class="com.abc.domain.Person" fetch="select" name="child" lazy="false" > 
        <column length="20" name="PERSON_ID" not-null="true"/> 
    </many-to-one>    
</class>

桌子是这样的

Person_Connect

  • PK - PARENT_PERSON_ID
  • PK - CHILD_PERSON_ID

  • PK - PERSON_ID
  • FNAME
  • LNAME

【问题讨论】:

  • 我想看看你的表结构是什么样的,看起来很有趣。
  • 我应该先添加表格。

标签: java hibernate jakarta-ee hibernate-mapping hbmxml


【解决方案1】:

您的映射错误,这是正确的映射。在多对一的情况下,列名是同一个表中的列,它是引用 Person 主键的外部项。

<class name="com.abc.domain.PersonConnect" table="PERSON_CONNECT">

 <composite-id>
    <key-many-to-one name="Parent" class="com.abc.domain.Person" column="PARENT_PERSON_ID"/>
    <key-many-to-one name="Child" class="com.abc.domain.Person" column=" CHILD_PERSON_ID"/>
     </composite-id>

</class>

【讨论】:

  • 哎哟!我看到我混淆了两个不同的东西,并试图把所有东西都放在同一个地方。让我试试,我会确认它是否有效。再次感谢。
  • 好的,这解决了复合 ID 的问题,但是当我尝试定义多对一外键时,我又回到了同样的情况。
  • 同样的修复——多对一总是引用另一个表的外键——不管它是否是键。
【解决方案2】:

嗯,首先,“父”和“子”似乎不太可能映射到同一列。这大概是个问题。否则,按照错误说明执行操作,并将insert="false" update="false" 添加到列映射之一。一列只能“属于”一个属性。否则,您可能会遇到无法解决的情况,其中一个属性说值应该是x,而另一个说它应该是y

【讨论】:

  • 我看不出它不太可能的原因。一个人有两个父母,我们需要将其映射到他们的 ID,并且有两个孩子,还需要将其映射到他们的 ID。
  • @Pradeep:是的,但是那个映射表明父母和孩子是同一个人。您只是在说服我,您应该映射到两个单独的 PARENT_ID 和 CHILD_ID 列,而不是单个 PERSON_ID 列。
  • 我应该首先添加表格。请详细说明在这种情况下父母如何成为孩子。
  • @Pradeep:你刚刚证明了我的观点。在 PersonConnect 类中,在多对一(组合 id 的一部分与否)中,您应该给出 Person_Connect 表中列的列名。该表中没有 PERSON_ID。您映射到的列名称需要是 PARENT_PERSON_ID 和 CHILD_PERSON_ID。摆脱对 PERSON_ID 的执着。在 PersonConnect 映射中根本不应该提及它。
  • 好的,但是它如何理解它在 Person 中映射到哪里
猜你喜欢
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-07
相关资源
最近更新 更多