2009-11-16 54 views
1

我试图坚持一个一对一的关系与春1.2.8休眠3.2.7ga但外键总是空。休眠+春+持续一到一个关系+空的外键

但是,让我先给你一个简短的介绍:

我有两个实体称为“ClientDomain”(网域)和“测量”。

Hibernate映射文件:

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 = 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(也改变了级联坚持)
  • 包裹saveOrUpdate在session.beginTransaction()和session.getTransaction()提交(。 )

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

回答

1

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

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

+0

非常感谢。那就是诀窍。回想起来,我有点生气,因为这是相对明显的:( – Jens 2009-11-16 14:07:44

+0

它可以理解,但休眠它可以包括任何数量的东西,包括明显的和不太明显的,我想我花了大约2天试图找出确切同样的问题,当我学习时,你很聪明,在你花费太多时间之前问你,祝你好运! – Zoidberg 2009-11-16 14:32:38