当前位置: 首页 > 知识库问答 >
问题:

继承实体类的通用回调方法(@PostLoad...)-JPA Eclipse Link

公西岳
2023-03-14

我的实体类层次结构如下所示。。ClassB扩展了ClassA,ClassA扩展了抽象mappedsuperclass AbstractClass

抽象类

@MappedSuperclass
public abstract class AbstractClass implements Serializable 
{

}

@Table(name = "TABLE_ONE")
@SecondaryTable(name = "TABLE_TWO", 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="Type", discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("ClassA")
public class ClassA extends AbstractClass
{
    @Column(name = "CLASSA_XML")
    private String ClassAXML;

    @PrePersist
    @PreUpdate
    public void covertObjectToXml()
    {
        this.ClassAXML= JAXBUtilities.marshal(Object);
    }

    @PostLoad
    public void convertXmlToObject()
    {
       //does unmarshal  
    }
}

B类

@DiscriminatorValue("ClassB")
public class ClassB extends ClassA 
{
    @Column(name = "CLASSB_XML", table = "TABLE_TWO")
    private String ClassBXML;

    @PrePersist
    @PreUpdate
    public void covertObjectToXml()
    {
        this.ClassAXML= JAXBUtilities.marshal(Object);
    }

    @PostLoad
    public void convertXmlToObject()
    {
       //does unmarshal  
    }
}

问题:当我坚持使用ClassB实体时。不会调用ClassA回调方法,并且不会持久化classAXml属性中的值。

是否可以为继承的实体类结构泛化回调方法(即covertObjectToXml和convertXmlToObject)。。因此,当我分别使用ClassA和ClassB进行持久化时,将根据继承分别调用回调方法,并且可以持久化它们的值。

注:

  1. 我已经从ClassA中删除了回调方法,并在classB和persist中对其进行了推广,但我的需求主要是ClassA和classB的个别persistent
  2. 我的回调方法不应该在mapedSuperClass中,即AbstractClass中

提前感谢

共有1个答案

叶裕
2023-03-14

有两种方法可以重用B类中A类的回调代码:

一、 最好/最优雅的方法是将整个代码移动到一个新类,比如MyEntityListeners,然后在实体类上使用@EntityListeners注释,如

@EntityListeners(class=MyEntityListeners.class)
public class ClassB extends ClassA {
  .....
}

public class MyEntityListeners {
    @PrePersist
    public void onPrePersist(Object entity) {
        //logic with entity (check the class of the entity or you can use `ClassA` instead of `Object`)
    }
}

请注意,EntityListeners在子类中继承自超类,因此,如果EntityListeners已在ClassA中定义,则无需在ClassB中执行任何操作(但可以在ClassB中添加不在ClassA中的其他EntityListeners)。要从层次结构中排除所有EntityListeners,可以使用@ExcludeSuperclassListeners

二、如果回调方法较少,层次结构树较小,则可以覆盖并重新注释a类中的每个回调,也可以在b类中这样做

...
public class ClassB extends ClassA {
  ......
  @Override
  @PrePersist
  public void myCallback() {
        super.myCallback();
  }
  ......
}
 类似资料:
  • 问题内容: 假设我有以下两个课程 如果我启动一个beta类型的新对象,如何执行在alpha类而不是beta中找到的逻辑?我可以使用<-我想知道是否可行。 Eclipse IDE中的自动键入功能使我可以选择从class 或class中进行选择。 问题答案: 你可以做: 注意,这是对父级的引用,但是super()是它的构造函数。

  • 嘿,我正在尝试调用子类方法(ChildClass扩展了超类()) 它没有看到ChildClass方法,我只能调用SuperClass()中的方法,我知道这可能是一个愚蠢的问题,但无论如何干杯

  • 我想用PHP在我的简单ORM中实现一个钩子系统: 这会导致一个致命错误: 致命错误:调用私人方法付款::before_save()从上下文'记录'中 有道理。 我可以将范围更改为public,但这似乎很难看:在保存()之前,除了支付之外,没有人与

  • 我有一个扩展了B类的a类。 A是这样定义的,它也覆盖了B的方法: B是这样定义的: 因此,如果我初始化A的一个对象,构造函数将调用调用方法doSomething()的超类之一。但哪一个会被处决?B的实现还是A中被重写的实现?

  • 我有以下类(请注意,方法是静态的): 当我打电话的时候: 我想得到输出: