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

时间:2013-10-15 06:51:45

标签: java inheritance jpa entity eclipselink

我的实体类层次结构如下.. ClassB 扩展了 ClassA ,扩展了abstract mappedsuperclass AbstractClass

抽象类

@MappedSuperclass
public abstract class AbstractClass implements Serializable 
{

}

ClassA的

@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  
    }
}

ClassB的

@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并坚持但我的要求主要是个人 持久的classA和ClassB。
  2. 我的回调方法不应该在mapedSuperClass中,即AbstractClass。
  3. 提前致谢

1 个答案:

答案 0 :(得分:2)

有两种方法可以在ClassA中重用ClassB中的回调代码:

我。最好/最优雅的方法是将整个代码移到一个新类,比如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`)
    }
}

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

II。如果你的回调方法和层次结构树较少,那么你可以在ClassA中覆盖和重新注释来自ClassB的每个回调

...
public class ClassB extends ClassA {
  ......
  @Override
  @PrePersist
  public void myCallback() {
        super.myCallback();
  }
  ......
}