2013-10-15 88 views
3

我的實體類層次結構如下.. ClassB的延伸ClassA的延伸抽象mappedsuperclass 抽象類通用回調方法(@PostLoad ..)爲繼承實體類 - JPA的EclipseLink

抽象類

@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中。

在此先感謝

回答

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,所以你並不需要,如果EntiyListeners在ClassA已經定義做任何事情在ClassB(但您可以添加在ClassB的額外EntityListeners,不在ClassA的) 。排除全部您可以使用的層次結構中的EntityListeners @ExcludeSuperclassListeners

II。如果你有較少的回調方法和一個小的層次樹,比你能覆蓋從ClassA重新註釋逢回調也ClassB

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

採用超正在爲個人持續兩ClassA和ClassB的的。但是我有一個疑問,使用EntityListener進行推廣對我來說很有好處,因爲我可以在'n'個實體類中使用它,因爲這兩種方法對於所有人都是通用的。現在我的問題是我必須傳遞一個類實例到這個回調方法(即MyEntityListeners)來設置它們各自的實體的列值。你可以建議任何這個問題。 – Karthigeyan

+0

這不是問題:您在'MyEntityListeners'的回調方法中獲得實體的實例。 EntityListeners也被繼承。看到我的chnaged響應。 –