Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当涉及继承时,如何在Hibernate/JPA中指定列名?_Java_Hibernate_Jpa_Inheritance_Groovy - Fatal编程技术网

Java 当涉及继承时,如何在Hibernate/JPA中指定列名?

Java 当涉及继承时,如何在Hibernate/JPA中指定列名?,java,hibernate,jpa,inheritance,groovy,Java,Hibernate,Jpa,Inheritance,Groovy,我想我是想在这里吃我的蛋糕,但我们会看看是否有一个可行的解决方案来解决我所寻找的问题。我有一个springboot/JPA/Hibernate应用程序,它将与MySQL对话,作为它的后台存储。从OOP的角度来看,我有几种情况下我的实体类形成了一个父/子层次结构,如下所示: // Groovy pseudo-code! class Vehicle { Long id Long maxSpeed String make String model } class Motorcycle

我想我是想在这里吃我的蛋糕,但我们会看看是否有一个可行的解决方案来解决我所寻找的问题。我有一个springboot/JPA/Hibernate应用程序,它将与MySQL对话,作为它的后台存储。从OOP的角度来看,我有几种情况下我的实体类形成了一个父/子层次结构,如下所示:

// Groovy pseudo-code!
class Vehicle {
  Long id
  Long maxSpeed
  String make
  String model
}

class Motorcycle extends Vehicle {
  Boolean isTwoStroke
}

class Car extends Vehicle {
  Boolean hasLeatherInterior
}
等等。通常,在JPA之外,我可能会这样设计他们各自的表格:

CREATE TABLE motorcycles (
  motorcycle_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  motorcycle_max_speed BIGINT UNSIGNED,
  motorcycle_make VARCHAR(50) NOT NULL,
  motorcycle_model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  car_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  car_max_speed BIGINT UNSIGNED,
  car_make VARCHAR(50) NOT NULL,
  car_model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);
CREATE TABLE motorcycles (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);
理想情况下我希望保持此表的设计不变,“父车辆”列的名称与上面的名称完全相同。但是如果我正确地理解了Hibernate/JPAAPI,那么我认为如果不做出某种牺牲,这是不可能的。我想我要么需要牺牲应用层的继承性,这样子类中的列就可以完全按照DB中的列命名:

@Entity
class Motorcycle {    // No longer extends Vehicle :-(
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name = "motorcycle_id")
  Long id

  @Column(name = "motorcycle_max_speed")
  Long maxSpeed

  @Column(name = "motorcycle_make")
  String make

  @Column(name = "motorcycle_model")
  String model

  @Column(name = "motorcycle_is_two_speed")
  Boolean isTwoStroke
}

@Entity
class Car {    // No longer extends Vehicle :-(
  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(name = "car_id")
  Long id

  @Column(name = "car_max_speed")
  Long maxSpeed

  @Column(name = "car_make")
  String make

  @Column(name = "car_model")
  String model

  @Column(name = "car_has_leather_interior")
  Boolean hasLeatherInterior
}
我认为我可以保留应用层继承,但随后需要像这样重构我的DB表:

CREATE TABLE motorcycles (
  motorcycle_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  motorcycle_max_speed BIGINT UNSIGNED,
  motorcycle_make VARCHAR(50) NOT NULL,
  motorcycle_model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  car_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  car_max_speed BIGINT UNSIGNED,
  car_make VARCHAR(50) NOT NULL,
  car_model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);
CREATE TABLE motorcycles (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  motorcycle_is_two_speed BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

CREATE TABLE cars (
  id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  max_speed BIGINT UNSIGNED,
  make VARCHAR(50) NOT NULL,
  model VARCHAR(50) NOT NULL,
  car_has_leather_interior BIT NOT NULL,

  # PK, FK, UC, index constraints down here (omitted for brevity)
);

所以我问:我是否可以保留我的应用层继承(并让摩托车和汽车继承车辆的属性)和使用我的首选约定命名DB表列(
指定一个类,其映射信息应用于从该类继承的实体。映射的超类
没有为其定义单独的表。
) 车辆类别:

@MappedSuperclass
public class Vehicle {
    @Id
    @GeneratedValue
    Long id;
    Long maxSpeed;
    String make;
    String model;
}
摩托车亚类

 @Entity
    @AttributeOverrides({
            @AttributeOverride(name = "id", column = @Column(name = "motorcycle_id"))
    })
    public class Motorcycle extends Vehicle {
        Boolean isTwoStroke;
    }

谢谢@Bhushan Uniyal(+1)-如果您不介意的话,请回答以下问题:我计划先创建自己的数据库,然后使用
hibernate.hbm2ddl.auto=validate
(而不是
create
或其他方法)。我还计划将MySQL中的主键设置为
AUTO_INCREMENT
列。如果MySQL PKs已经自动递增,并且如果我让Hibernate简单地
validate
验证我现有的数据库,我甚至需要在代码中的PK字段上指定
@GeneratedValue
?再次感谢!@smeeb yes您可以删除@Generated值,它将在没有它的情况下工作,因为您正在数据库级别使用
AUTO_INCREMEN
启用。另外
hibernate.hbm2ddl.AUTO=validate
将处理您的数据库架构,因此这里没有问题