3

我的实体类层次结构如下.. ClassB扩展ClassA扩展抽象 mappedsuperclass AbstractClass

抽象类

@MappedSuperclass
public abstract class AbstractClass implements Serializable 
{

}

A类

@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 并持久化,但我的要求主要是 classA 和 ClassB 的单独持久化。
  2. 我的回调方法不应该在 mapedSuperClass 即 AbstractClass 中。

提前致谢

4

1 回答 1

2

ClassA重用in 中的回调代码有两种可能性ClassB

I.最好/最优雅的方法是将整个代码移动到一个新类中,例如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继承ClassB的,因此如果已经在其中定义了 EntiyListener ,则无需执行任何操作ClassA(但您可以在 ClassB 中添加不在 ClassA 中的其他 EntityListener)。要从层次结构中排除所有EntityListeners,您可以使用@ExcludeSuperclassListeners

二、如果你有更少的回调方法和一个小的层次结构树,那么你可以覆盖ClassA并重新注释每个回调ClassB

...
public class ClassB extends ClassA {
  ......
  @Override
  @PrePersist
  public void myCallback() {
        super.myCallback();
  }
  ......
}
于 2013-10-16T09:20:32.210 回答