2014-02-18 64 views
1

我也有類似的這三個表:的Hibernate映射一個外鍵列到多個表

vehicles 
- id1 
- id2 
- vehicle_type_id 
- vehicle_detail_id 
- primary key(id1, id2) 
buses 
- id 
... 
cars 
- id 
... 

vehicleTypeId決定了車輛的類型,也從表中vehicleDetails是要被取出。參加車輛的vehicleDetailId和特定車輛類型的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> 

也有一些是錯誤的映射文件,作爲數據庫沒有被初始化。請讓我知道,如果我錯過了什麼。謝謝。

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) 
+0

沒有錯誤日誌可用?有沒有好的理由不使用註釋? –

+0

更新錯誤日誌。尚未探索註釋。想要如何實現使用映射 – jyothiv

+0

它是整個堆棧跟蹤? –

回答

0

這是列數不正確時的典型錯誤消息。在這種情況下,您的聯接中只有一個主鍵列。聯接是與主鍵相關的表,因此它們需要具有相同的主鍵。在你的情況下,車輛有兩個ID,而巴士和汽車只有一個。

聯接元素指定一個新的表,並將鍵列作爲主鍵和外鍵。

考慮讓它成爲一個多對一的類,每個類都有不同的類型。 (而不是連接)。

它也將映射到一個到任何屬性。