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

jmo*_*ira 10 java hibernate jpa composition

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

POJO JPA实体类

@Entity
@Table("test")
public class Test implements Serializable {
}
Run Code Online (Sandbox Code Playgroud)

扩展类

public class ExtendedTest extends Test {
...
}
Run Code Online (Sandbox Code Playgroud)

获取扩展类的对象

List<ExtendedTest> extendedList = entityManager.createNamedQuery("ExtendedTest.findByFoo").setParameter("foo", "bar").getResultList();
Run Code Online (Sandbox Code Playgroud)

我正在评估的另一种可能方式是使用复合实体扩展功能并委派所有setter和getter,但这可能意味着对大型表的大量工作:

public class ExtendedTest2 {
    private Test test;

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

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

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

    ...
}
Run Code Online (Sandbox Code Playgroud)

任何建议将非常感谢.

Ily*_*lya 22

运用 @Inheritance

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

@Entity
public class ExtendedTest 
    extends Test {
    ...
}  
Run Code Online (Sandbox Code Playgroud)

要么 @MappedSuperclass

@MappedSuperclass
public class Test {
    ...
}

@Entity
public class ExtendedTest 
    extends Test {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 如果有人得到这个,idk如果它是错的或因为版本(JPA 2.1,eclipse链接),但我不得不在子类中添加`@Inheritance(strategy = InheritanceType.SINGLE_TABLE)`注释,而不是父类 (4认同)
  • 扩展类(父类)上的“@MappedSuperclass”对我有用。 (3认同)
  • 仅供参考:在抽象类上使用`@ Entity`时,每个派生实体都应该创建自己的表,在这种情况下,你必须在*abstract parent*表上使用`@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)`! (2认同)