Java 一个外键列到多个表的Hibernate映射

Java 一个外键列到多个表的Hibernate映射,java,hibernate,Java,Hibernate,我有三张类似的表格: vehicles - id1 - id2 - vehicle_type_id - vehicle_detail_id - primary key(id1, id2) buses - id ... cars - id ... vehicleTypeId决定车辆的类型以及从哪个表中获取车辆详细信息。连接将在车辆的车辆详细id和特定车辆类型的id上进行。 我是这样创建类的: class Vehicle{ VehiclePk pk; Long vehicleTyp

我有三张类似的表格:

vehicles
- id1
- id2
- vehicle_type_id
- vehicle_detail_id
- primary key(id1, id2)
buses
- id
...
cars
- id
...
vehicleTypeId决定车辆的类型以及从哪个表中获取车辆详细信息。连接将在车辆的车辆详细id和特定车辆类型的id上进行。 我是这样创建类的:

class Vehicle{
    VehiclePk pk;
    Long vehicleTypeId;
    Long vehicleDetailId;
}

class Bus extends Vehicle{
    Long id;
}

class Car extends Vehicle{
    Long id;
}

class VehiclePk {
    private Long id1;
    private Long id2;

    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof VehiclePk) {
            VehiclePk p = (VehiclePk)obj;
            return id1.equals(p.id1) && id2.equals(p.id2);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return (id1 + id2).hashCode();
    }
}
我尝试使用鉴别器在hibernate映射文件中组合和元素:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping schema="test_db">
    <class name="Vehicle" table="vehicles" discriminator-value="0">
    <composite-id name="pk" class="VehiclePK">
        <key-property name="id1" column="id1" type="long"/>
        <key-property name="id2" column="id2" type="long"/>
    </composite-id>
    <discriminator column="vehicle_type_id" type="long"/>
<property name="vehicleDetailId" column="vehicle_detail_id" type="long"/>

    <subclass name="Bus" discriminator-value="1">
        <join table="vehicles" >
            <key column="vehicle_detail_id" />
            ... 
        </join>         
    </subclass>
    <subclass name="Car" discriminator-value="2">
        <join table="vehicles" >
            <key column="vehicle_detail_id" />
            ... 
        </join>         
    </subclass>
</class>

当列数不正确时,这是一条典型的错误消息。在这种情况下,联接中只有一个主键列。联接是与主键相关的表,因此它们需要具有相同的主键。在您的例子中,车辆有两个ID,而公共汽车和汽车只有一个ID

join元素指定一个新表,其中key列同时作为主键和外键

考虑将其设置为多对一,每个子类具有不同的类型。(而不是连接)


它还将映射到任何属性的一。

是否没有可用的错误日志?有没有不使用批注的好理由?已用错误日志更新。我还没有研究过注释。想知道如何使用mappingsIs实现整个stacktrace吗?
UPDATE : It gives ArrayIndexOutOfBoundsException: 1
Stacktrace :
...
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1206)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1026)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4421)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4734)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:943)
at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:778)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:504)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1385)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:306)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1389)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1653)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1662)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1642)
at java.lang.Thread.run(Thread.java:662)