簡體   English   中英

JPA實體擴展類包含@Id

[英]JPA entity extends class contain @Id

我有實體類都包含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;
}

謝謝你們

您可以使用@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文檔:

指定一個類,其映射信息應用於從其繼承的實體。 映射的超類沒有為其定義單獨的表。

你當然可以。 使用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/

只需將commonFields類作為實體添加到persistence.xml文件中。

EclipseLink / JPA注釋 - @MappedSuperclass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM