扩展JPA实体以添加属性和逻辑

20

我需要知道是否可以通过扩展POJO JPA实体(使用hibernate提供程序)来添加一些属性和行为,然后使entityManager返回扩展对象而不仅仅是POJO实体,就像以下示例:

POJO JPA实体类

@Entity
@Table("test")
public class Test implements Serializable {
}

扩展类

public class ExtendedTest extends Test {
...
}

获取扩展类的对象

List<ExtendedTest> extendedList = entityManager.createNamedQuery("ExtendedTest.findByFoo").setParameter("foo", "bar").getResultList();

我正在考虑的另一种可能是通过扩展功能使用复合实体并委派所有设置器和获取器,但这可能意味着在处理大表时需要大量工作:

public class ExtendedTest2 {
    private Test test;

    public ExtendedTest2(Test test) {
        this.test = test;
    }

    public getFoo() {
        return test.getFoo();
    }

    public getBar() {
        return test.getBar();
    } 

    ...
}

非常感谢您的任何建议。


我认为这是不可能的,因为你可以将逻辑和其他属性放在实体类中。 - dcernahoschi
1
实际上,我可以向我的实体类添加其他属性和逻辑,但并不是“愉快的”。我的想法是将实体保持像POJO一样,并仅保留表格表示属性,事实上这正是我首先提出这个问题的原因。 - jmoreira
1个回答

39

使用 @Inheritance

@Entity
@Table(name="TEST")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
public class Test {
    ...
}

@Entity
public class ExtendedTest 
    extends Test {
    ...
}  

或者@MappedSuperclass

@MappedSuperclass
public class Test {
    ...
}

@Entity
public class ExtendedTest 
    extends Test {
    ...
}

7
如果有人看到这条消息,我不知道是因为什么原因(可能是JPA 2.1和Eclipse Link版本的问题),但我必须在子类中添加@Inheritance(strategy=InheritanceType.SINGLE_TABLE)注解,而不是在父类中添加。 - rekiem87
3
仅供参考:当在抽象类上使用 @Entity,并且每个派生实体都应该创建自己的表时,在这种情况下,您必须在抽象父表上使用 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) - membersound
我们如何在使用相同类名但不同包时进行扩展?例如,我想要扩展实体的 toString 函数,但我不想为实体使用不同的名称! - MJBZA
3
在扩展类(父类)上使用@MappedSuperclass对我很有用。 - javaPlease42

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接