我有一个我希望通过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属性(仅在普通属性中)。
有没有人知道如何克服这个问题,或者是否有更好的解决方案来解决这个问题。
如果您需要更多信息,请告诉我们,
干杯 西蒙
答案 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查询作为解组过程的开销,虽然它在同一个会话中,但它仍然不是最优的。
如果有人对更好的解决方案有任何想法,我将非常感激。
干杯