JPA通过扩展而无需继承来重用代码

时间:2012-03-14 05:58:59

标签: jpa

我有两个或更多的桌子彼此相似。

PARENT
  ID   | PK
  NAME | VARCHAR

CHILD
  ID   |PK
  NAME | VARCHAR
  AGE  | INT

这不是@Inheritance情况,因为它们是独立实体,并且@OneToMany@ManyToOne彼此相关。

我为彼此创建实体类。

@Entity
public class Parent {
    @Id
    private Long id;
    private String name;
    @ManyToOne(mappedBy = "parent")
    private Collection<Child> children;
}

@Entity
public class Child {
    @Id
    private Long id;
    private String name;
    private int age;
    @OneToMany
    private Parent parent;
}

有没有很好的方法来共享公共字段映射?

// @MappedSuperclass // is this what it is exactly for? 
public abstract class Base {
    // @Id protected Long id; // @@?
    @Column(name = "name", nullable = false)
    private String name;
}

@Entity
public class Parent extends Base {
    @Id
    @TableGenerator(...)
    @GeneratedValue(...)
    protected Long id;
    @ManyToOne(mappedBy = "parent")
    private Collection<Child> children;
}

@Entity
public class Child extends Base {
    @Id
    @TableGenerator(...)
    @GeneratedValue(...)
    protected Long id;
    private int age;
    @OneToMany
    private Parent parent;
}

这样可以吗? 甚至可以在基础上声明@Id protected Long id;,在@TableGenerator@GeneratedVAlue上扩展课程吗?

1 个答案:

答案 0 :(得分:2)

  

有没有很好的方法来共享公共字段映射?

MappedSuperclass是完全正确的工具。

  

甚至可以声明@Id protected Long id;在基地   将@TableGenerator和@GeneratedVAlue留在扩展类上?

不,这是不可能的。