有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在每个具体类的表场景中,Hibernate继承中@AttributeOverrides的java问题

我正在学习Hibernate框架(5.xx),在使用注释实现每个具体类的表继承时遇到了问题

以下是代码结构:

——>;受雇者爪哇

@Entity
@Table(name="TPCEmp")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Employee implements Serializable {
@Id
@Column(name="empId",nullable = false)
@GeneratedValue(strategy = GenerationType.AUTO)
private int Id;

@Column(name="empName")
private String name;

@Column(name="emp_joinDate")
@Temporal(javax.persistence.TemporalType.DATE)
private Date joinDate;

@Column(name="emp_work_hours")
private int work_hours;

//getters & setters
}

——>;技术人员爪哇

@Entity
@Table(name = "TPCTech")
@AttributeOverrides({
    @AttributeOverride(name = "techempId", column = @Column(name = "empId")),
    @AttributeOverride(name = "techempName", column = @Column(name = "empName")),
    @AttributeOverride(name = "techemp_joinDate", column = @Column(name = "emp_joinDate")),
    @AttributeOverride(name = "techemp_work_hours", column = @Column(name = "emp_work_hours"))
})
public class Techie extends Employee {

    @Column(name = "language_used")
    private String language_used;

//getters & setters 
}

——>;支持爪哇

@Entity
@Table(name = "TPCSupport")
@AttributeOverrides({
    @AttributeOverride(name = "supportempId", column = @Column(name = "empId")),
    @AttributeOverride(name = "supportempName", column = @Column(name = "empName")),
    @AttributeOverride(name = "supportemp_joinDate", column = @Column(name = "emp_joinDate")),
    @AttributeOverride(name = "supportemp_work_hours", column = @Column(name = "emp_work_hours"))
})
public class Support extends Employee {

    @Column(name = "tool_used")
    private String tool_used;
//getters & setters
}

——>;冬眠cfg。xml

<hibernate-configuration>
    <session-factory>
        <property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">update</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/Hibernate</property>
        <property name="connection.username">root</property>
        <property name="connection.password">Shashi.742744</property>
        <mapping class="tableperconcreteclassinhierarchy.Employee"/>
        <mapping class="tableperconcreteclassinhierarchy.Techie"/>
        <mapping class="tableperconcreteclassinhierarchy.Support"/>
    </session-factory>
</hibernate-configuration>

在执行程序时,我得到一个异常:

Exception in thread "main" org.hibernate.AnnotationException: An entity annotated with @Inheritance cannot use @AttributeOverride or @AttributeOverrides: tableperconcreteclassinhierarchy.Techie
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:566)
    at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:250)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:231)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:274)
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.build(MetadataBuildingProcess.java:84)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:474)
    at org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:85)
    at tableperconcreteclassinhierarchy.TablePerConcreteClassinHierarchy.main(TablePerConcreteClassinHierarchy.java:30)

——>;主要类别代码:

public static void main(String[] args) {
        // TODO code application logic here
        StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
        Metadata md = new MetadataSources(ssr).getMetadataBuilder().build();

        SessionFactory sf = md.buildSessionFactory();
        Session sess = sf.openSession();
        Transaction t = sess.beginTransaction();

        Employee emp = new Employee();
        emp.setName("emp1");
        emp.setJoinDate(Date.from(Instant.now()));
        emp.setWork_hours(8);

        Techie tech = new Techie();
        tech.setName("tech1");
        tech.setJoinDate(Date.from(Instant.now()));
        tech.setWork_hours(8);
        tech.setLanguage_used("Java");

        Support sp = new Support();
        sp.setName("support1");
        sp.setJoinDate(Date.from(Instant.now()));
        sp.setWork_hours(8);
        sp.setTool_used("CSC");

        sess.persist(emp);
        sess.persist(tech);
        sess.persist(sp);

        t.commit();

        sess.close();
        sf.close();
        ssr.close();
    }

那么,我是不是实施错了?或者我是否遗漏了任何需要的额外注释

任何见解都会非常有用

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    您可以从每个子类中删除@AttributeOverrides注释并更改GenerationType。自动转换为GenerationType。员工等级表

    GenerationType.TABLE