2013-04-09 50 views
0

問題:如何僅在其類型非常重要時存儲字段。在只有類型很重要時,在JPA中持久保存成員變量

說明:我已經簡化問題說明突出問題。類Dragon有一個行爲,Roar,它存儲爲成員變量。 A Roar通常沒有狀態,不需要保存。但是,Dragon需要知道它在重新創建時具有的特定類型的Roar

@Entity 
public class Dragon implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private double height; 
    private Roar roar; 

    public String roar() { 
     return roar.roar(); 
    } 
} 

public interface Roar { 
    String roar(); 
} 

public class QuietRoar implements Roar { 
    public String roar() { 
     return "grr.."; // In real scenario, lots of logic occurs here. 
} 

public class LoudRoar implements Roar { 
    public String roar() { 
     return "AHHHGRRRR"; // More logic here. 
} 

可能的解決方案: 充分利用roar字段瞬態和存儲Class型保持所述類型的字段roar的一個附加字段。該Dragon類就變成了:

@Entity 
public class Dragon implements Serializable { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    private double height; 
    @Transient 
    private Roar roar; 
    private Class<? extends Roar> roarType; 

    public void setRoar(Roar roar) { 
     this.roar = roar; 
     roarType = roar.getClass(); 
    } 

    public String roar() { 
     if(roar == null) { 
      try { 
       roar = roarType.newInstance(); 
      } catch (InstantiationException | IllegalAccessException ex) { 
       // oo ohh.. 
      } 
     } 
     return roar.roar(); 
    } 
} 

回答

1

如果您正在使用的EclipseLink,您可以使用一個轉換器,用於此。

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_converter.htm#CHDEHJEB

具體來說,你可以使用它存儲在列類的名稱ClassInstanceConverter。

JPA 2.1還將定義一個轉換器的概念。

+0

我有這種方法的一個問題。它解決了問題與JPA持續,然而,類仍然實現Serializable,如果我試圖序列化這個類的一個實例,我會得到一個運行時異常,如'Roar'沒有實現Serializable,不會被標記短暫的。 – Kevin 2013-04-09 23:35:31

+0

我認爲這個問題可以通過使用屬性訪問來避免,例如transient關鍵字不會影響JPA。 – Kevin 2013-04-12 06:30:05