【问题标题】:How to extend JPA entity to just add composition如何扩展 JPA 实体以仅添加组合
【发布时间】: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


    【解决方案1】:

    如果我将 EnhancedEmployee 设为实体,那么 JPA 会尝试创建/使用 EnhancedEmployee 数据库表(现在在开发中,所以我正在使用 create-drop persistence.xml 属性)。

    您可以通过将继承类型更改为 SINGLE_TABLE 来避免这种情况

    在我看来,您的鉴别器列emp_id 也是一个糟糕的选择。最好将其更改为 @DiscriminatorColumn(name = "TYPE") 之类的内容,因为 emp_id 是主键并且不能在表中重复。你的EnhancedEmployee 也需要@DiscriminatorValue(value = "ENHANCED")

    【讨论】:

    • 嗯,可能就是这么简单!我明天必须完成这个,在实体映射中获得重复列......
    • 所以映射实体错误中的重复列是因为我需要使用超类“emp_id”的PK作为鉴别器。即使将可插入/可更新的错误设置为我也会出错。如果我删除 @DiscriminatorColumn(name = "emp_id") 实体管理器需要一个 DType 字段。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    相关资源
    最近更新 更多