我的实体类层次结构如下.. 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单独,我的回调方法分别根据继承调用,它们的值可以保持不变。
注意:
提前致谢
答案 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`)
}
}
请注意,超级类的子类中EntityListeners
为inherited,因此如果已在ClassB
中定义了EntiyListeners,则无需在ClassA
中执行任何操作(但您可以在ClassB中添加其他不在ClassA中的EntityListener)。要从层次结构中排除所有 EntityListeners,您可以使用@ExcludeSuperclassListeners
II。如果你的回调方法和层次结构树较少,那么你可以在ClassA
中覆盖和重新注释来自ClassB
的每个回调} p>
...
public class ClassB extends ClassA {
......
@Override
@PrePersist
public void myCallback() {
super.myCallback();
}
......
}