Проблема с @AttributeOverrides в Hibernate Inheritance во время Table для конкретного сценария класса - PullRequest
0 голосов
/ 09 января 2019

Я изучаю фреймворк Hibernate (5.xx) и у меня возникают проблемы с таблицей для реализации конкретного класса с использованием аннотаций.

Ниже приведена структура кода:

-> Employee.java

@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
}

-> Techie.java

@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 
}

-> Support.java

@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
}

-> hibernate.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 Ответ

0 голосов
/ 05 апреля 2019

вы можете удалить аннотацию @AttributeOverrides из каждого класса подкласса и изменить GenerationType.AUTO на GenerationType.TABLE в классе Employee.

GenerationType.TABLE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...