Java Hibernate中多次出现自定义CompositeUserType,导致MappingException
嗨,我有以下代码:Java Hibernate中多次出现自定义CompositeUserType,导致MappingException,java,hibernate,usertype,Java,Hibernate,Usertype,嗨,我有以下代码: public class Trail { private int trailID; private Location startLocation; private Location destination; // Getters and setters } 哪个位置是自定义数据库类型,它不是表 public class LocationType implements org.hibernate.usertype.CompositeUserT
public class Trail {
private int trailID;
private Location startLocation;
private Location destination;
// Getters and setters
}
哪个位置是自定义数据库类型,它不是表
public class LocationType implements org.hibernate.usertype.CompositeUserType {
@Override
public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session) throws HibernateException, SQLException {
if ( value == null ) {
DoubleType.INSTANCE.set(st, null, index, session);
DoubleType.INSTANCE.set(st, null, index+1, session);
DoubleType.INSTANCE.set(st, null, index+2, session);
StringType.INSTANCE.set(st, null, index+3, session);
} else {
final Location loc = (Location) value;
DoubleType.INSTANCE.set(st, loc.getLatitude(), index, session);
DoubleType.INSTANCE.set(st, loc.getLongitude(), index+1, session);
DoubleType.INSTANCE.set(st, loc.getAltitude(), index+2, session);
StringType.INSTANCE.set(st, loc.getDescription(), index+3, session);
}
}
// Other functions
}
这是我的定位课
public class Location implements Serializable {
...
}
Trail.hbm.xml如下所示:
<hibernate-mapping package="com.mytest.walking">
<class name="Trail" table="TB_Trail" dynamic-insert="true">
<id name="TrailID" column="TrailID" >
<generator class="native"/>
</id>
<property name="StartLocation" type="LocationType" >
<column name="latitude" />
<column name="longitude" />
<column name="altitude" />
<column name="description" />
</property>
<property name="Destination" type="LocationType" >
<column name="latitude" />
<column name="longitude" />
<column name="altitude" />
<column name="description" />
</property>
</class>
</hibernate-mapping>
有人能告诉我如何消除此异常的正确方向吗?为什么不使用componentmapping
<component name="StartLocation" >
<property name="..." column="latitude" />
<property name="..." column="longitude" />
<property name="..." column="altitude" />
<property name="..." column="description" />
</property>
<component name="Destination" >
<property name="..." column="latitude" />
<property name="..." column="longitude" />
<property name="..." column="altitude" />
<property name="..." column="description" />
</property>
我找到了答案。只需以不同的方式命名列即可。它们不需要与自定义类型名称相同
<hibernate-mapping package="com.mytest.walking">
<class name="Trail" table="TB_Trail" dynamic-insert="true">
<id name="TrailID" column="TrailID" >
<generator class="native"/>
</id>
<property name="StartLocation" type="LocationType" >
<column name="StartLocationLatitude" />
<column name="StartLocationLongitude" />
<column name="StartLocationAltitude" />
<column name="StartLocationDescription" />
</property>
<property name="Destination" type="LocationType" >
<column name="DestinationLatitude" />
<column name="DestinationLongitude" />
<column name="DestinationAltitude" />
<column name="DestinationDescription" />
</property>
</class>
</hibernate-mapping>
如果从hbm中删除一个Location属性是否有效?感谢您的建议,但如果可能,我希望使用usertype而不是component。因为虽然这种方法适用于这种情况,但位置类型也在其他表中使用。我只是不想在所有这些表中重复列(纬度、经度、海拔、描述等)。但是您必须重复列名,请参阅您发布的代码。usertype只指定列的类型,而不指定列的名称,或者您切换到映射注释或使用.NET和FluentNHibernate,在其中可以映射组件一次并在映射中引用它。感谢帮助。我想我找到了解决方案。对,这很有帮助。我仍然会使用组件,因为您不需要整个customusertype
<hibernate-mapping package="com.mytest.walking">
<class name="Trail" table="TB_Trail" dynamic-insert="true">
<id name="TrailID" column="TrailID" >
<generator class="native"/>
</id>
<property name="StartLocation" type="LocationType" >
<column name="StartLocationLatitude" />
<column name="StartLocationLongitude" />
<column name="StartLocationAltitude" />
<column name="StartLocationDescription" />
</property>
<property name="Destination" type="LocationType" >
<column name="DestinationLatitude" />
<column name="DestinationLongitude" />
<column name="DestinationAltitude" />
<column name="DestinationDescription" />
</property>
</class>
</hibernate-mapping>