2015-10-15 37 views
0

我在Hibernate和MySQL中有單表繼承的問題。 我的代碼很簡單:字段列表中的單表繼承和Unknwon列

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="VEHICLE_TYPE") 
@Table(name="VEHICLE") 
public abstract class Vehicle { 

    @Id 
    @Column(name="VEHICLE_ID") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long vehicleId; 

    @Column(name="MAKE") 
    private String make; 

    @Column(name="MODEL") 
    private String model; 

    //setters and getters 
} 

和:

@Entity 
public class Car extends Vehicle { 

    @Column(name="BODY") 
    private String body; 

//setters and getters 
} 

我也有一個服務來獲取所有汽車:

@Override 
public List<Car> getCars() { 
    TypedQuery<Car> query = em.createQuery("SELECT c FROM Car c", Car.class); 
    return query.getResultList(); 
} 

當我運行應用程序,並嘗試獲取列表我得到以下控制檯輸出:

休眠:選擇car0_.VEHICLE_ID爲VEHICLE_2_6_, car0_.MAKE爲MAKE3_6_,car0_.MODEL爲MODEL4_6_,car0_.BODY作爲BODY7_6_從車輛car0_其中car0_.VEHICLE_TYPE = '車'

警告:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL錯誤:1054 ,SQLSTATE:42S22 錯誤:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 在「字段列表」

Hovever未知列「car0_.BODY」,我的表模型已制定此列,並使用該服務工作正常,沒有繼承。 任何想法我錯過了什麼?

+0

您是否嘗試將輸出SQL執行到數據庫本身(即通過Workbench)?你有同樣的結果嗎? – Ish

+0

好點。它不起作用,我得到了同樣的錯誤:「字段列表」中的未知列'car0_.BODY' – jarosik

回答

0

也許,你應該檢查你的VEHICLE表的定義,如果它確實包含BODY列。錯誤表明它沒有這樣的列。也許您需要重新創建表格或手動更新表格定義以包含該列。如果您在hibernate配置或persistence.xml中使用hibernate屬性hbm.ddl.auto,請將其設置爲UPDATE以更新架構。

+0

車輛沒有BODY列,它只是汽車的財產。這是我希望它的工作方式:車輛屬性在所有車輛之間共享,而車身僅適用於汽車。 – jarosik

+0

我在說你的物理表VEHICLE,而不是你的實體類。由於您使用Single table strategy,因此您的Vehicle和Car實體類都只映射到一個表格 - 這是VEHICLE表格。 BODY列也應該在VEHICLE表中。這就是單桌戰略的工作原理。 – Ish