Hibernate + Spring +持久化一对一关系+空外键

时间:2009-11-16 13:59:03

标签: java hibernate spring

我试图与 Spring 1.2.8 Hibernate 3.2.7ga 保持一对一的关系,但外键总是空的。

但我先简单介绍一下:

我有两个名为“ClientDomain”(Web-Domain)和“Measurement”的实体。

Hibernate Mapping Files:

ClientDomain.hbm.xml:

<hibernate-mapping package="statistics.jobs.domain">

<class name="ClientDomain" table="domains" lazy="false">

<id column="id" name="id" type="int">
  <generator class="native"/>
</id>

<property name="version" not-null="false"/>
<property name="url"/>
<property name="etrackerApiUser" column="etracker_api_user"/>
<property name="etrackerApiKey" column="etracker_api_key"/>
<property name="etrackerUsername" column="etracker_username"/>
<property name="etrackerPassword" column="etracker_password"/>

<set 
  name="measurements" 
  table="measurements" 
  lazy="false" 
  cascade="merge,save-update" 
  inverse="true">
  <key column="domain" />
  <one-to-many class="Measurement"/>
</set>   

</class>

</hibernate-mapping>

Measurement.hbm.xml:

<hibernate-mapping package="statistics.jobs.domain">

<class name="Measurement" table="measurements" lazy="false">

<id column="id" name="id" type="int">
  <generator class="native"/>
</id>

<property name="version" not-null="false"/>
<property name="time" type="java.util.Date"/>
<property name="numberOfDocuments" column="documents"/>

<one-to-one 
  name="domain" 
  class="ClientDomain" 
  cascade="merge,save-update"
/>   

</class>

</hibernate-mapping>

我从域的各种来源获取一些统计信息,然后想要保留它们。通过这种方式,我有一个域名的历史记录。

ClientDomain对象已经是持久性的。

如下所示创建Measurement对象:

Measurement measurement = new Measurement();
measurement.setDomain(domain);
measurement.setTime(new Date());
measurement.setNumberOfDocuments(22222);
measurementManager.insertMeasurement(measurement);

insertMeasurement(测量测量):

public void insertMeasurement(Measurement measurement) {    
  getHibernateTemplate().saveOrUpdate(measurement);
}

结果如下:

+----+---------+-----------+---------------------+--------+
| id | version | documents | time                | domain |
+----+---------+-----------+---------------------+--------+
| 82 |    NULL |     22222 | 2009-11-16 14:28:32 |   NULL |
| 83 |    NULL |     22222 | 2009-11-16 14:28:33 |   NULL |
| 84 |    NULL |     22222 | 2009-11-16 14:28:34 |   NULL |
+----+---------+-----------+---------------------+--------+

我已经检查过域实例是否正确。一切都是应有的。

那么我做错了什么?为什么域外键不随测量一起保存?

到目前为止我尝试了什么:

  • 调用persist而不是saveOrUpdate(也更改为cascaded to persist)
  • 将saveOrUpdate包装在session.beginTransaction()和session.getTransaction()。commit()

但到目前为止,我没有运气。

1 个答案:

答案 0 :(得分:1)

你有一个从ClientDomain到测量的一对多关系。但是你有一个从Measurement到ClientDomain的一对一关系。

使Measurement to ClientDomain中的关系成为多对一关系。