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>