gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:39 26 4
gpt4 key购买 nike

我的实体类层次结构如下.. 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 并坚持,但我的要求主要是个人A 类和 B 类的持久性。
  2. 我的回调方法不应该在 mapedSuperClass 即 AbstractClass 中。

提前致谢

最佳答案

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

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`)
}
}

请注意 EntityListenersinherited在父类(super class)的子类中,所以如果 EntiyListeners 已经在 ClassA 中定义,那么您不需要在 ClassB 中做任何事情(但是您可以在 ClassB 中添加额外的 EntityListeners,它们是不属于 A 类)。要从层次结构中排除所有 EntityListeners,您可以使用 @ExcludeSuperclassListeners

II. 如果您的回调方法较少且层次结构树较小,那么您可以覆盖并重新注释来自 ClassA 以及 ClassB< 中的每个回调喜欢

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

关于java - 继承实体类的通用回调方法(@PostLoad..) - JPA EclipseLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19374917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com