【问题标题】:Single Table Inheritance and Unknwon column in field list字段列表中的单表继承和未知列
【发布时间】:2015-10-15 13:17:03
【问题描述】:

我在 Hibernate 和 MySQL 中遇到单表继承问题。 我的代码很简单:

@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();
}

当我运行应用程序并尝试获取汽车列表时,我得到以下控制台输出:

休眠:从 VEHICLE car0_ 中选择 car0_.VEHICLE_ID 作为 VEHICLE_2_6_,car0_.MAKE 作为 MAKE3_6_,car0_.MODEL 作为 MODEL4_6_,car0_.BODY 作为 BODY7_6_,其中 car0_.VEHICLE_TYPE='Car'

警告:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL 错误:1054,SQLState:42S22 错误:org.hibernate.engine.jdbc.spi.SqlExceptionHelper - '字段列表'中的未知列'car0_.BODY'

然而,我的表模型有这个列,而且这个服务在没有继承的情况下可以正常工作。 有什么想法我想念什么?

【问题讨论】:

  • 您是否尝试将输出 SQL 执行到数据库本身(即通过 Workbench)?你得到了同样的结果吗?
  • 好点。它不起作用,我得到同样的错误:'字段列表'中的未知列'car0_.BODY'

标签: mysql hibernate inheritance


【解决方案1】:

也许,如果您的 VEHICLE 表确实包含 BODY 列,您应该检查它的定义。该错误表明它没有这样的列。也许您需要重新创建表或手动更新表定义以包含该列。如果您在 hibernate 配置或 persistence.xml 中使用 hibernate 属性 hbm.ddl.auto,请将其设置为 UPDATE 以更新架构。

【讨论】:

  • Vehicle 没有 BODY 列,它只是作为 Car 的财产。这是我希望它工作的方式:车辆属性在所有车辆之间共享,而 Body 仅适用于 Car。
  • 我说的是你的物理表 VEHICLE,而不是你的实体类。由于您使用的是单表策略,因此您的 Vehicle 和 Car 实体类都仅映射到一个表 - 即 VEHICLE 表。 BODY 列也应该在 VEHICLE 表中。这就是单表策略的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2019-12-09
  • 2023-03-14
相关资源
最近更新 更多