实体中的继承

时间:2018-06-09 10:25:54

标签: java hibernate

继承如何在实体中运作?我的意思是例如

public class Animal {
    private String name;

    //Getters and setters
}


@Entity
public class Dog extends Animal {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
}

但是hibernate只在数据库中使用id创建表,为什么?

3 个答案:

答案 0 :(得分:0)

你的基础classe没有用 .message:first-of-type { background: purple; } 注释,所以hibernate不知道它的存在。 ORM中的继承未在Java中实现为继承。您有特定的构造/注释来定义表继承。

答案 1 :(得分:0)

您应该使用@MappedSuperClass标记您的超级课程:

@MappedSuperClass
public class Animal {
    private String name;

    //Getters and setters
}

答案 2 :(得分:0)

来自Java Platform, Enterprise Edition: The Java EE Tutorial

  

37.2.3非实体超类

     

实体可能有非实体超类,而这些超类可以   无论是抽象的还是具体的。非实体超类的状态   是非持久的, 以及从非实体继承的任何状态   实体类的超类是非持久的 。非实体   超级类可能不会在EntityManagerQuery操作中使用。的 任何   非实体超类中的映射或关系注释   忽略。

所以你需要这样的东西:

@MappedSuperclass
public class Animal {

    @Column
    private String name;

    //Getters and setters
}

同样来自abve提到的来源:

  

37.2.2映射超类

     

实体可以从包含持久状态和映射信息但不是实体的超类继承。 也就是说,   超类没有用@Entity注释修饰,也没有   由Java Persistence提供程序映射为实体。这些   当你有状态和映射时,最常使用超类   多个实体类共有的信息。

     

通过使用。装饰类来指定映射的超类   注释javax.persistence.MappedSuperclass