我的实体类层次结构如下所示。。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进行持久化时,将根据继承分别调用回调方法,并且可以持久化它们的值。
注:
提前感谢
有两种方法可以重用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中被重写的实现?
我有以下类(请注意,方法是静态的): 当我打电话的时候: 我想得到输出: