【发布时间】:2016-01-19 21:15:13
【问题描述】:
我有一个 Employee 实体的具体类。员工被其他应用程序持久化,我只是在使用数据。我想扩展 Employee 以添加使用组合的其他实体的属性。我不需要保留子实体本身,而只需要保留我试图通过使用组合扩展到 Employee 的实体。这是一些有助于清除问题的代码。
@Entity
@Table(name = "Legacy_Table_Name", schema = "another_owner")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "emp_id")
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Id
private String emp_id;
private String firstName;
etc...
-
public class EnhancedEmployee extends Employee implements Serializable {
private static final long serialVersionUID = 1L;
@Transient
private SomeEntity someCompositionProperty;
@OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private Collection<AnotherEntityWithItsOwnTable1> list1;
@OneToMany(mappedBy = "employee", fetch = FetchType.EAGER, cascade=CascadeType.ALL)
private Collection<AnotherEntityWithItsOwnTable2> list2;
如果我将 EnhancedEmployee 设为实体,那么 JPA 会尝试创建/使用 EnhancedEmployee 数据库表(现在在 dev 中,所以我正在使用 create-drop persistence.xml 属性)。如果我从 EnhancedEmployee 中删除 @Entity 注释,JPA 会抱怨 EnhancedEmployee 不是我想要使用这些额外属性的其他类中的实体
@ManyToMany(cascade = CascadeType.MERGE)
@LazyCollection(LazyCollectionOption.FALSE)
@JoinTable(name = "PARTICIPATING_EMPLOYEES", joinColumns = { @JoinColumn(name = "event_id") }, inverseJoinColumns = { @JoinColumn(name = "emp_id") })
private Collection<EnhancedEmployee > participants;
我要做的就是为这些额外属性引用一个 Employee setter getter,无论它们是否为这些额外属性保留了数据。
我意识到我可能只是修改我的 Employee 类并将 someCompositionProperty 和 list1/2 关系添加到该类,但这不会违反https://en.wikipedia.org/wiki/Open/closed_principle。虽然我的 Employee 实体类对于我的所有项目都是“相同的”,但源代码实际上是每个项目包的一部分,所以可能打开/关闭在这里不适用,我应该只修改 Employee 实体类
【问题讨论】:
标签: java jpa inheritance composition