2013-04-25 58 views
0

我一直在使用Objectify4在Google數據存儲上持續使用泛型集合。例如。持久集合<T>在GAE上使用Objectify4

@Entity 
class AnimalInfo 
{ 
    @Id 
    String id; 
    Collection<Animal> animals; 
} 

@EntitySubClass 
class Cat extends Animal 
{ 
    String name; 
} 

@EntitySubClass 
class Dog extends Animal 
{ 
    String name; 
} 

@Entity 
class Animal 
{ 
    @Id 
    String id; 
} 

我該如何堅持AnimalInfo類並再次檢索它。我已經嘗試過: objectify.save().entities(animalInfo).now();但在取回它時:objectify.load().type(AnimalInfo.class).id(animalInfo.id).get();沒有name字段對應於擴展類Cat或Dog。

這也可能是合乎邏輯的,因爲動物類沒有字段name。但是,我怎樣才能使這個工作?通用接口IAnimal(代替Animal類)在設計上是更好的解決方案,但它不適用於Objectify,因爲它需要具體類型。

上述問題的解決方案?


在此先感謝。

Shaun

回答

1

總之,它看起來像你想要的多態實體的引用的集合。這樣做:

@Entity 
class AnimalInfo { 
    @Id String id; 
    Collection<Ref<Animal>> animals = new ArrayList<Ref<Animal>>(); 
} 

您需要Refs創建對其他實體的引用。你也可以使用Key,但它不太方便。您可能還想查看@Load註釋。

+0

感謝您的回覆。這意味着'動物'集合只會引用數據存儲。我如何在它內部的動物的內存中的實例(沒有堅持它)?我可以通過讓第二個Collection僅僅具有內存中的'Animals'並且在常規集合更新時更新Ref集合來想辦法解決這個問題?我不認爲這是一個好的解決方案。有任何想法嗎? – Shaun 2013-04-26 10:04:29

+0

Objectify目前不支持@ Embed對象中的多態。如果你想要一個現在可以工作的原始解決方案,你可以使用@Serialize。 – stickfigure 2013-04-26 19:21:37