JPA实体扩展类包含@Id

时间:2014-06-12 06:24:28

标签: java jpa

我有实体类都包含id作为主键,我可以创建包含所有公共字段的抽象类,并允许所有类扩展此类如下:

public abstract class CommonFields{
    @Id
@Column(name = "ID")
private long id;

public void setId(long id) {
    this.id = id;
}

public long getId() {
    return id;
}
}

@Entity
    @Table
    public class B extends CommonFields{
    String carModel;
}




@Entity
    @Table
    public class A extends CommonFields{
    String name;
}

谢谢大家

3 个答案:

答案 0 :(得分:12)

您可以使用@MappedSupperclass

的公共字段注释该类
@MappedSuperclass
public abstract class CommonFields{
    @Id
    @Column(name = "ID")
    private long id;

    public void setId(long id) {
        this.id = id;
    }

    public long getId() {
        return id;
    }
}

来自@MappedSuperclass doc:

  

指定一个其映射信息应用于的类   从中继承的实体。映射的超类没有单独的   为它定义的表。

答案 1 :(得分:0)

当然可以。使用Hibernate,您可以使用三种不同的实现方式。

使用鉴别器:哪个@DiscriminatorValue确定实体类型。 这种情况下两个实体共享相同的表

        @Entity
    @Table(name = "PERSON")
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(
        name="discriminator",
        discriminatorType=DiscriminatorType.STRING
    )
    @DiscriminatorValue(value="P")
    public abstract class Person {

        @Id
        @GeneratedValue
        @Column(name = "PERSON_ID")
        private Long personId;

        @Column(name = "FIRSTNAME")
        private String firstname;

        @Column(name = "LASTNAME")
        private String lastname;

        // Constructors and Getter/Setter methods, 
    }


  @Entity
  @Table(name="PERSON")
  @DiscriminatorValue("E")
  public class Employee extends Person {

      @Column(name="joining_date")
      private Date joiningDate;

      @Column(name="department_name")
      private String departmentName;

      // Constructors and Getter/Setter methods, 
  }

或者你可以为每个子类使用一个表:

    @Entity
    @Table(name = "PERSON")
    @Inheritance(strategy=InheritanceType.JOINED)
    public abstract class Person {

        @Id
        @GeneratedValue
        @Column(name = "PERSON_ID")
        private Long personId;

        @Column(name = "FIRSTNAME")
        private String firstname;

        @Column(name = "LASTNAME")
        private String lastname;

        public Person() {

        }

        public Person(String firstname, String lastname) {
            this.firstname = firstname;
            this.lastname = lastname;
        }

        // Getter and Setter methods, 
    }

      @Entity
      @Table(name="EMPLOYEE")
      @PrimaryKeyJoinColumn(name="PERSON_ID")
      public class Employee extends Person {

          @Column(name="joining_date")
          private Date joiningDate;

          @Column(name="department_name")
          private String departmentName;

          public Employee() {
          }

          public Employee(String firstname, String lastname, String departmentName, Date           joiningDate) {

              super(firstname, lastname);

              this.departmentName = departmentName;
              this.joiningDate = joiningDate;
          }

          // Getter and Setter methods, 
      }

您可以在http://viralpatel.net/blogs/hibernate-inheritance-table-per-subclass-annotation-xml-mapping/

找到其余的详细信息

答案 2 :(得分:0)

只需将commonFields类作为实体添加到persistence.xml文件中。

EclipseLink / JPA Annotations – @MappedSuperclass