表中的Hibernate Reference列指示如何在同一个表中的另一列中解组属性

时间:2010-02-11 13:40:04

标签: java hibernate persistence

我有一个我希望通过Hibernate持续存在的实体(3.2) EntityBean有一个列,指示如何解组实体bean的另一个值:

<class name="ServiceAttributeValue" table="service_attribute_value">
      <cache usage="nonstrict-read-write"/>
      <id name="id" column="id" type="int-long">
         <generator class="native"/>
      </id>
      <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true" />
      <!-- order is important here -->
      <property name="value" type="attribute-value" not-null="true">
         <column name="service_attribute" />
         <column name="id_value"/>
         <column name="enum_value"/>
         <column name="string_value"/>
         <column name="int_value"/>
         <column name="boolean_value"/>
         <column name="double_value"/>
      </property>
   </class>

“service_attribute”列指示在解组值时要查看“value”属性的哪些列,更重要的是,确定值应该是什么类型,例如enum_value时的枚举类要读取,或者如果要读取id_value,则读取Bean的类型。

value属性使用自定义CompositeUserType来进行解组,在此我希望引用service_attribute列(虽然不写入它),但是当我尝试这样做时,我收到以下错误:

org.hibernate.MappingException: Repeated column in mapping for entity: com.precurse.apps.rank.model.service.ServiceAttributeValue column: service_attribute (should be mapped with insert="false" update="false")

但是,在复合属性的定义中,未定义这些xml属性(仅在普通属性中)。

有没有人知道如何克服这个问题,或者是否有更好的解决方案来解决这个问题。

如果您需要更多信息,请告诉我们,

干杯 西蒙

4 个答案:

答案 0 :(得分:1)

我有类似的问题,改变一列的情况解决了这个问题。可以尝试一下!
例如,一列可以是service_attribute,其他Service_Attribute。

答案 1 :(得分:1)

你可以试试这个。不是将两个值都映射到同一个表上的属性,而是使用join将其中一个属性映射到自身,并将其他属性保持为原样。在这种情况下,您将能够访问两个地方的相同属性。请记住将该属性命名为不同的名称。

      <join table="service_attribute_value">
         <key column = "id" />
         <property name="serviceAttribute" type="service-attribute" column="service_attribute" not-null="true"  />
      </join>

      <!-- order is important here -->
      <property name="value" type="attribute-value" not-null="true">
         <column name="service_attribute" />
         <column name="id_value"/>
         <column name="enum_value"/>
         <column name="string_value"/>
         <column name="int_value"/>
         <column name="boolean_value"/>
         <column name="double_value"/>
      </property>

答案 2 :(得分:0)

根据您的描述,您似乎想要做的是基于service_attribute创建不同的子类。您可以查看hibernate inheritance mapping,而不是尝试实现不允许在休眠状态下重复的列映射。

答案 3 :(得分:0)

我认为我找到了一个解决方案,尽管不是一个非常优雅的解决方案。

中的

 public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
         throws HibernateException, SQLException {

CompositeUserType的方法传递给方法的“owner”参数包含我想要访问的service_attribute对象的id。

令人讨厌的是,所有者的实际serviceAttribute是不可访问的,或者在此阶段尚未设置(我在hbm.xml配置中使用了元素的排序,以防这是一个订购的事情,但不幸的是仍然没有快乐),所以我不能简单地访问它。

无论如何设置了所有者对象的id,所以我使用session参数来运行基于id的HQL查询来访问serviceAttribute,然后我用它来正确地解组value属性。

这个解决方案的缺点是它需要一个HQL查询作为解组过程的开销,虽然它在同一个会话中,但它仍然不是最优的。

如果有人对更好的解决方案有任何想法,我将非常感激。

干杯