【问题标题】:com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'DTYPE'com.microsoft.sqlserver.jdbc.SQLServerException:列名“DTYPE”无效
【发布时间】:2015-02-02 10:43:20
【问题描述】:

我正在尝试在 Hibernate 中进行单表继承,但我遇到了一个错误,我无法弄清楚。

我继承的类

@Entity
@Table(name = "Vechicle")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="DTYPE")
public class Vehicle_object implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column
private int vehicleid;

@Column(name = "Vehiclename")
private String vehiclename;

public Vehicle_object() {
    super();
    // TODO Auto-generated constructor stub
}

public int getVehicleid() {
    return vehicleid;
}

public void setVehicleid(int vehicleid) {
    this.vehicleid = vehicleid;
}

public String getVehiclename() {
    return vehiclename;
}

public void setVehiclename(String vehiclename) {
    this.vehiclename = vehiclename;
}

}

儿童班。

@Entity
public class TwoWheeler extends Vehicle_object {

    private String handle;

    public String getHandle() {
        return handle;
    }

    public void setHandle(String handle) {
        this.handle = handle;
    }

    public TwoWheeler() {
        super();
        // TODO Auto-generated constructor stub
    }

}

第二个孩子。

@Entity
public class FourWheeler extends Vehicle_object {

    private String stearing;

    public String getStearing() {
        return stearing;
    }

    public void setStearing(String stearing) {
        this.stearing = stearing;
    }

    public FourWheeler() {
        super();
        // TODO Auto-generated constructor stub
    }

}

和主类方法。

try {
            Session session = HibernateUtil.getSessionFactory().openSession();
            session.beginTransaction();

            Vehicle_object object = new Vehicle_object();
            //object.setVehicleid(0);
            object.setVehiclename("Car");

            TwoWheeler twoWheeler = new TwoWheeler();
            twoWheeler.setVehiclename("Apache");
            twoWheeler.setHandle("Apache handle");

            FourWheeler fourWheeler = new FourWheeler();
            fourWheeler.setStearing("Ford Car Stearing");
            fourWheeler.setVehiclename("FIGO FORD");

            session.save(object);
            session.save(twoWheeler);
            session.save(fourWheeler);

            session.getTransaction().commit();
            session.clear();
            session.close();

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

得到这个异常。

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid column name 'DTYPE'.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:388)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:338)
    at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:185)
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:160)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(SQLServerPreparedStatement.java:306)
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:186)
    ... 23 more

我已经搜索了很多,但我无法找到解决方案。

【问题讨论】:

    标签: java hibernate jdbc single-table-inheritance mssql-jdbc


    【解决方案1】:

    您需要在父类中添加一个鉴别器列,然后在每个子类中添加一个鉴别器值。由于你有多个类对应同一个数据库表,Hibernate 需要知道哪一行要映射到哪个类。

    所以:

    @Entity
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
    public abstract class Parent { //bla }
    
    
    @Entity
    @DiscriminatorValue("child1")
    public class Child1 extends Parent { //bla }
    
    @Entity
    @DiscriminatorValue("child2")
    public class Child2 extends Parent { //bla }
    

    现在,如果你持久化 Child1 的一个实例,那么这个实例的数据库行将在 type 列中具有值 child1,因此当你从数据库加载行时,Hibernate 知道基于这一行生成的对象是Child1

    【讨论】:

    • 你的数据库中有这样的列吗?
    • 我已将 hibernate.hbm2ddl.auto 创建,所以它会创建该字段吗?
    • 应该,但查找错误的第一条规则是“永远不要相信任何东西”。您应该检查它是否真的存在,因为错误消息声称它不是。
    • 是的,我知道应该这样做。但有一件事是我已经把那个注释放在上面这么说。我已经看到了很多可行的例子。
    【解决方案2】:

    说起来有点奇怪,但该示例无需任何更改即可工作。

    我使用的是 Hibernate 4.2 最终版。我不知道为什么它不支持。

    我已将版本更改为 3.6.10 Final,并且可以正常工作。我不知道为什么 Hibernate 4.2 Final 无法解决这个问题,但这是我的解决方案。

    【讨论】:

      猜你喜欢
      • 2022-11-03
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 2017-06-08
      相关资源
      最近更新 更多