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();
}
}
我有這種方法的一個問題。它解決了問題與JPA持續,然而,類仍然實現Serializable,如果我試圖序列化這個類的一個實例,我會得到一個運行時異常,如'Roar'沒有實現Serializable,不會被標記短暫的。 – Kevin 2013-04-09 23:35:31
我認爲這個問題可以通過使用屬性訪問來避免,例如transient關鍵字不會影響JPA。 – Kevin 2013-04-12 06:30:05