【问题标题】:Extend JPA entity to add attributes and logic扩展 JPA 实体以添加属性和逻辑
【发布时间】:2012-09-16 05:18:08
【问题描述】:

我需要知道是否可以通过扩展某些 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();

我正在评估的另一种可能方式是使用复合实体扩展功能并委派所有 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();
    } 

    ...
}

任何建议将不胜感激。

【问题讨论】:

  • 我认为不可能,因为您可以愉快地将逻辑和其他属性放在实体类中。
  • 我实际上可以向我的实体类添加其他属性和逻辑,但不能“高兴地”,我的想法是保留像 POJO 这样的实体并只保存表表示属性,事实上这正是我创建这个的原因首先是问题。

标签: java hibernate jpa composition


【解决方案1】:

使用@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 {
    ...
}

【讨论】:

  • 如果有人得到这个,idk 如果它是错误的或者因为版本(JPA 2.1,eclipse 链接),但我必须在子类中添加 @Inheritance(strategy=InheritanceType.SINGLE_TABLE) 注释,而不是父类
  • 仅供参考:在抽象类上使用@Entity时,每个派生实体都应创建自己的表,在这种情况下,您必须在抽象父类上使用@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) i> 桌子!
  • 当我们对类使用相同的名称但在不同的包中时,我们如何进行此扩展?我希望有这种可能性来扩展实体,例如 toString 函数,但我不想为实体使用不同的名称!
猜你喜欢
  • 1970-01-01
  • 2021-02-14
  • 2016-12-02
  • 2018-07-28
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多