【问题标题】:Composite id in HibernateHibernate 中的复合 id
【发布时间】:2015-05-21 13:46:39
【问题描述】:

大家晚上好。

我正在开发一个使用 Hibernate 4.x 的应用程序。我目前在一个类中使用复合 id 并将另一个类的关系映射到这个类时遇到问题。

我有一个 ParadaBus 对象,它代表一个巴士站(西班牙语),每个都由一个整数和一个字符串标识:

public class ParadaBus implements Serializable {

   private Integer id;
   private String concesionRecogida;

   ......

   @Override
   public int hashCode() {
       return this.id.hashCode() + this.concesionRecogida.hashCode();
   }

   @Override
   public String toString() {
        return "ParadaBus [" + id + " " + concesionRecogida + "]";
   }
}

另一方面,我有另一个类,它包含一个 ParadaBus 对象的单个实例:

public class TrabajadorNombramiento implements Serializable {
    ...
   private ParadaBus suParada;
    ...
}

我想将此关系映射到一个 XML HBM 文件,但我想我做错了

这是 ParadaBus 的 .hbm.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "Hibernate Mapping 3.0" 
    "http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>

<class name="com.ingartek.cavwebapp.model.ParadaBus" table="ParadasBus">

    <composite-id >
        <key-property name="id" type="integer">
            <column name="id" />    
        </key-property>

        <key-property name="concesionRecogida" type="string">
            <column name="concesion_recogida" />    
        </key-property>

    </composite-id>
    ...
</class>
</hibernate-mapping>

在这里,一切似乎都是正确的。下面的 sn-p 代码代表另一个类的 hbm.xml,其中应该映射与 ParadaBus 的关系:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "Hibernate Mapping 3.0" 
    "http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>

    <class name="com.ingartek.cavwebapp.model.TrabajadorNombramiento" table="nombramientos">
        ...
        <many-to-one name="suParada" class="com.ingartek.cavwebapp.model.ParadaBus" cascade="none">
            <column name="id_parada" />
            <column name="concesion_recogida" />
        </many-to-one>
        ...
    </class>
</hibernate-mapping>

我做错了吗?

感谢您的帮助。

编辑:

最终,我决定使用 UUID 来识别每个 ParadaBus 对象/行。

【问题讨论】:

  • hbm.xml 不是旧的做事方式吗?我虽然 Hibernate 4 是注释驱动的
  • @JonK 据我所知,XML 方式并未被弃用。或许我应该变成注解……

标签: java xml hibernate composite-primary-key composite-id


【解决方案1】:

关系中的列名与类映射中的列名不同。

尝试: .hbm.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "Hibernate Mapping 3.0" 
    "http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>

<class name="com.ingartek.cavwebapp.model.ParadaBus" table="ParadasBus">

    <composite-id >
        <key-property name="id" type="integer">
            <column name="id_parada" />    
        </key-property>

        <key-property name="concesionRecogida" type="string">
            <column name="concesion_recogida" />    
        </key-property>

    </composite-id>
    ...
</class>
</hibernate-mapping>

另一个类的hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "Hibernate Mapping 3.0" 
    "http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>

    <class name="com.ingartek.cavwebapp.model.TrabajadorNombramiento" table="nombramientos">
        ...
        <many-to-one name="suParada" class="com.ingartek.cavwebapp.model.ParadaBus" cascade="none">
            <column name="id_parada" />
            <column name="concesion_recogida" />
        </many-to-one>
        ...
    </class>
</hibernate-mapping>

【讨论】:

  • 我的问题更难了。我继承了这个实现(这不是我的选择)。评论一下,并非 TrabajadorNombramiento 的每条记录在数据库(或我继承的数据)中都有 ParadaBus。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2023-04-10
  • 2017-10-14
  • 2017-04-27
  • 1970-01-01
相关资源
最近更新 更多