Java 子类能否具有与超类相同的列名?

Java 子类能否具有与超类相同的列名?,java,hibernate,jpa,Java,Hibernate,Jpa,我已经使用继承映射创建了数据库表。我希望所有表都有审核列 代码如下: 抽象的可审核类 个人类别: 学生班: 和职员班: 我的问题是,只生成了人员表的在创建的和学生表的在创建的和由创建的为空 是否有可能让员工和学生表的在和创建的也生成?您遇到问题的原因是因为这是一个一对一的关联,而不是继承 这种映射将不起作用,因为当您使用继承时,您将声明一个学生是一个人,因此,创建学生的那一刻就是创建人的那一刻。因此,没有理由在表中复制这两列 而且,您使用的是InheritanceType.JO

我已经使用继承映射创建了数据库表。我希望所有表都有审核列

代码如下:

  • 抽象的可审核类
  • 个人类别:
  • 学生班:
  • 和职员班:
我的问题是,只生成了
人员
表的
创建的
学生
表的
创建的
创建的
为空


是否有可能让
员工
学生
表的
创建的
也生成?

您遇到问题的原因是因为这是一个一对一的关联,而不是继承

这种映射将不起作用,因为当您使用继承时,您将声明一个
学生
是一个
,因此,创建学生的那一刻就是创建人的那一刻。因此,没有理由在表中复制这两列

而且,您使用的是
InheritanceType.JOINED
,基本上要求不在表之间共享公共列

这种映射有意义的唯一方法是,如果这些列表示不同的 创造时代。例如,当一个人出生时,当他成为一名学生时。 如果是这种情况,您可以使用以下映射:

    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Student extends Person {
        int grade;

        @Column(name = "createdAt")
        LocalDateTime studentCreatedAt;

        @Column(name = "createdBy")
        String studentCreatedBy;
    }

    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Staff extends Person {

        int salary;

        @Column(name = "createdAt")
        LocalDateTime staffCreatedAt;

        @Column(name = "createdBy")
        String staffCreatedBy;
    }
    @Entity
    public class Person extends Auditable {
        @Id
        Long id;
        String name;
    }

    @Entity
    public class Student extends Auditable {
        @Id
        Long id;

        int grade;

        @MapsId
        @OneToOne
        Person person;
    }

    @Entity
    public class Staff extends Auditable {
        @Id
        Long id;

        int salary;

        @MapsId
        @OneToOne
        Person person;
    }
如果不是这种情况,则
Person
不是
Student
Staff
的超类,您可以使用此映射表示您的数据库:

    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Student extends Person {
        int grade;

        @Column(name = "createdAt")
        LocalDateTime studentCreatedAt;

        @Column(name = "createdBy")
        String studentCreatedBy;
    }

    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Staff extends Person {

        int salary;

        @Column(name = "createdAt")
        LocalDateTime staffCreatedAt;

        @Column(name = "createdBy")
        String staffCreatedBy;
    }
    @Entity
    public class Person extends Auditable {
        @Id
        Long id;
        String name;
    }

    @Entity
    public class Student extends Auditable {
        @Id
        Long id;

        int grade;

        @MapsId
        @OneToOne
        Person person;
    }

    @Entity
    public class Staff extends Auditable {
        @Id
        Long id;

        int salary;

        @MapsId
        @OneToOne
        Person person;
    }

其中
@MapsId
告诉Hibernate ORM,
列person\u id
也是该表的键。因此,您不需要
@PrimaryKeyJoinColumn(name=“person\u id”)

如何将
@heritance(strategy=heritancetype.JOINED)
放入
可审核的
?从学生中删除@heritance(并阅读)
    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Student extends Person {
        int grade;

        @Column(name = "createdAt")
        LocalDateTime studentCreatedAt;

        @Column(name = "createdBy")
        String studentCreatedBy;
    }

    @Entity
    @PrimaryKeyJoinColumn(name = "person_id")
    public static class Staff extends Person {

        int salary;

        @Column(name = "createdAt")
        LocalDateTime staffCreatedAt;

        @Column(name = "createdBy")
        String staffCreatedBy;
    }
    @Entity
    public class Person extends Auditable {
        @Id
        Long id;
        String name;
    }

    @Entity
    public class Student extends Auditable {
        @Id
        Long id;

        int grade;

        @MapsId
        @OneToOne
        Person person;
    }

    @Entity
    public class Staff extends Auditable {
        @Id
        Long id;

        int salary;

        @MapsId
        @OneToOne
        Person person;
    }