【问题标题】:what if no ID column in the table for Hibernate?如果 Hibernate 表中没有 ID 列怎么办?
【发布时间】:2012-07-06 21:27:27
【问题描述】:

在我的应用程序中,我的一个表中没有主键列。我将其视为代理键并尝试使用标记。但我遇到了异常。

**"org.hibernate.MappingException: Error reading resource:     
    com/mapping/FamilyDetails.hbm.xml"**

**Caused by: org.xml.sax.SAXParseException: 
    The content of element type "class" must match "
    (meta*,subselect?,cache?,synchronize*,comment?,
    (id|composite-id),discriminator?,natural-id?,(version|timestamp)?,
    (property|many-to-one|one-to-one|component|dynamic-
    component|properties|any|map|set|list|bag|idbag|array|
    primitive-array|query-list)*,
    ((join*,subclass*)|joined-subclass*|union-subclass*),loader?,
    sql-insert?,sql-update?,sql-delete?,filter*)".**

映射文件:-FamilyDetails.hbm.xml

<class name="com.beans.FamillyDetails" 
       table="personal_fmly_dtls" proxy="com.aims.beans.FamillyDetails">


    <natural-id>
        <property name="systemid" />
    </natural-id>
    <property name="membername" 
              type="java.lang.String" column="membername" not-null="true" />
    <property name="relation"  
              type="java.lang.String" column="relation" not-null="true" />
    <property name="dateOfBirth"  
              type="java.util.Date" column="dateofbirth" not-null="true" />

    <many-to-one name="Personal" column="pid" class="com.aims.beans.Personal"/>

</class>



<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class name="com.aims.beans.Personal" 
       table="personalinfo" proxy="com.aims.beans.Personal">

<id name="pid" column="pid" type="java.lang.Integer">
    <generator class="sequence">
        <param name="sequence">personal_seq</param>
    </generator>
</id>
<property name="name"  
          type="java.lang.String" column="name" not-null="true" />
<property name="deptno"  
          type="java.lang.Integer" column="DEPTNO" not-null="true" />

<component name="permentaddress" class="com.aims.beans.Address">
    <property name="homeAddress1" type="java.lang.String" column="pddress1"/>
    <property name="homeAddress2" type="java.lang.String" column="pddress2"/>
    <property name="homecity"     type="java.lang.String" column="pcity"/>
    <property name="homeState"    type="java.lang.String" column="pstate"/>
</component>
<set name="famildtlslst">
    <key column="pid" not-null="true"/>
    <one-to-many class="com.aims.beans.FamillyDetails"/>
</set>
<join table="address">     
    <key column="pid" /> 
    <component name="Address" class="com.aims.beans.Address">
        <property name="homeAddress1" 
                  type="java.lang.String" column="HomeAddress1"/>
        <property name="homeAddress2" 
                  type="java.lang.String" column="HomeAddress2"/>
        <property name="homecity" 
                  type="java.lang.String" column="homecity"/>
        <property name="homeState" 
                  type="java.lang.String" column="homestate"/>
    </component>
</join>

请帮帮我。

【问题讨论】:

  • java hibernate 中的 xml-mapping 过时了吗?我的意思是,在编辑器和重构工具的帮助下,它很容易编写。它将映射与实体实现分离。我也不确定您是否可以使用注释完成所有使用 xml 可以执行的操作。但是我对java不熟悉,我用的是NHibernate和C#。

标签: hibernate


【解决方案1】:

它可能是另一个组件。组件不需要主键:

<set name="famildtlslst" table="personal_fmly_dtls">
  <key column="pid" not-null="true"/>
  <composite-element parent="Personal">
    <property name="systemid" />
    <property name="membername" not-null="true" />
    <property name="relation" not-null="true" />
    <property name="dateOfBirth" not-null="true" />
  </composite-element>
</set>

当然这是另一种语义,但是如果您对组件感到满意,那就更容易了。

【讨论】:

  • 所以,它不需要任何映射文件。它很好。但通常如果表没有任何主键。有什么替代方法?但我尝试使用 natural-id。是吗正确的方式使用 natural-id。
  • 没有主键就无法映射实体。在这里看看这个问题:stackoverflow.com/questions/767277/hibernate-and-no-pk
猜你喜欢
  • 2019-12-24
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
相关资源
最近更新 更多