【问题标题】:Save instance which extended from Entity保存从实体扩展的实例
【发布时间】:2017-10-22 12:04:59
【问题描述】:

我有一个定义雇员表的实体。对于项目结构,有一些像"EmployeeTrn","EmployeeBck",...这样的子类,它们只是从Employee超类扩展而来。所有的属性和方法都完全相同。

@Entity
@Table(name = "EMPLOYEE")
public class Employee {
   @Id @GeneratedValue
   @Column(name = "id")
   private int id;

   @Column(name = "first_name")
   private String firstName;

   @Column(name = "last_name")
   private String lastName;

   @Column(name = "salary")
   private int salary;  

   public Employee() {}
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getFirstName() {
      return firstName;
   }
   public void setFirstName( String first_name ) {
      this.firstName = first_name;
   }
   public String getLastName() {
      return lastName;
   }
   public void setLastName( String last_name ) {
      this.lastName = last_name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

扩展子类如下。

public class EmployeeTrn extends Employee{
        public EmployeeTrn(){
            id = Builder.generateSSI();
            firstName = Helper.fetchFromLocal("8091").name();
            lastName = Helper.fetchFromLocal("8091").surname();
        }
    }


public class EmployeeBck extends Employee{
            public EmployeeBck(){
                id = Builder.generateSSIFromHost("localhost:8091");
                firstName = Helper.fetchFromAWS("/token.dat").name();
                lastName = Helper.fetchFromAWS("/token.dat").surname();
            }
        }

我已经在配置 xml 文件上映射了 Employee 实体。但是当我尝试保存从 Employee 扩展的类时,就会出现 问题

session.saveEmployee(employeeTrn);

Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.company.EmployeeTrn

谁能帮助我?我被卡住了。

【问题讨论】:

  • 实例是什么意思?从实体类扩展你想达到什么目的?
  • @pouyankhodabakhsh 由于项目结构,我应该扩展 EmployeeTrn 等实例。这个扩展的子类具有与 super 完全相同的属性和方法。之所以使用这个,每个子类都有不同的属性值。

标签: java spring hibernate jpa hibernate-mapping


【解决方案1】:

休眠没有识别实体。因此,您还需要映射 EmployeeTrn 实体:

查看继承配置:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#entity-inheritance

【讨论】:

    【解决方案2】:

    你的子类实体也应该定义为实体,因为你没有定义你的继承类型,继承策略将是单表,这意味着你的超类和它的孩子将被映射到同一个表,所以它你应该定义子类的实体是有道理的。

    @Entity
    public class EmployeeTrn extends Employee{
        public EmployeeTrn(){
            id = Builder.generateSSI();
            firstName = Helper.fetchFromLocal("8091").name();
            lastName = Helper.fetchFromLocal("8091").surname();
        }
    

    【讨论】:

    • 但 EmployeeTrn 不应该是实体。对于项目结构,不同的实例(如 EmployeeTrn)使用不同的参数进行初始化。所以在创建每个实例之后,我想保存 Employee,它是实例的超类。我认为我的问题就像一个类型转换,但不知道如何解决:/
    • 要让hibernate识别你的类它应该是实体,现在继承策略定义了你想要完成的事情,如果你只是想映射父级,那你为什么还需要孩子呢?假设您的父母有 10 个属性,而您的孩子有 12 个属性,如果父母是唯一映射的属性(这不可能发生),那么在孩子中而不是父母中的另外 2 个属性将丢失
    • 子类与超类完全相同。我已经更新了任务。每个子类都有不同的属性值。像 EmployeeTrn.name = "EmployeeTrnHolland", EmployeeBck.name="EmployeeBckAsia"...
    • 如果它们具有相同的属性和不同的值,那么这是对继承的滥用,你需要的是一个策略,阅读策略设计模式,无论如何这就是hibernate的工作方式,甚至子类应定义为实体
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多