2010-02-22 53 views
2

的JPA教程指出一個可具有非實體延伸實體類:延續實體(jpa)的非實體類 - 示例?

實體可以延伸兩個實體和 非實體類和非實體 類可以延伸實體類。 - http://java.sun.com/javaee/5/docs/tutorial/doc/bnbqa.html

是否有可能堅持這樣的結構?

我想這樣做:

@Entity 
abstract class Test { ... } 

class FirstConcreteTest extends Test { ... } // Non-ntity 
class SecondConcreteTest extends Test { ... } // Non-entity 

Test test = new FirstConcreteTest(); 

em.persist(test); 

我想什麼它做的是堅持映射的抽象測試到一個公共的數據庫表的所有具體類(第一和第二)的所有領域,使所有第一個和第二個測試類的字段未被執行(這些可以包含像EJB,jdbc池等等)。

還有一個獎金問題。是否有可能堅持抽象財產?

@Entity 
abstract class Test { 

    @Column 
    @Access(AccessType.PROPERTY) 
    abstract public String getName(); 

} 

class SecondConcreteTest extends Test { 
    public String getName() { 
     return "Second Concrete Test"; 
    } 
} 

回答

2
+0

正如我在DataNucleus的評論中所說 - 我想避免用@Entity標記具體類,因爲它們有很多。並且所有持續存在的信息已經可以通過抽象類獲得。額外的具體類的註釋增加了不必要的混亂,並且使得創建這些類變得更加困難(您必須記住要標記字段瞬變,添加@Entity,添加區分值等)。我想我會堅持Spring的SimpleJdbcInsert。謝謝,帕斯卡。 – 2010-02-23 10:16:21

2

再次閱讀該鏈接。 「實體類必須遵循以下要求: *該類必須使用javax.persistence.Entity批註註釋。」

如果一個類是一個非實體,那麼它是一個非實體,因此不會作爲一個實體持久化。任何持久化都必須標記爲這樣,因此將您的子類標記爲實體,並將您不想保留的字段標記爲「瞬態」。

+0

是的,但這正是我一直試圖避免的 - 用@Entity標記具體測試類的超文本,它的字段爲瞬態。但這還不是全部 - 我還需要添加@DiscriminatorValue(我在數據庫中有一個區分列,但值不同於JPA默認值)。 但我開始認爲這只是不合邏輯的。我只想插入數據,但JPA需要知道如何以相反的方式實例化類。對我而言,這可能是不可能的。至少只要我的超類是抽象的。 無論如何,感謝您的答案,DataNucleus。 – 2010-02-23 09:24:23