2013-11-20 68 views
1

我正在嘗試實現一個簡單的GAE服務。特殊情況我有學生實體和類別實體。對每個學生可以關聯一個或多個類別。我如何使用Objectify創建這種關係? THanks物化與關係

編輯:這是我的代碼。它有效嗎?

@Entity 
public class Studente { 
    static long nextID = 17; 

    public static Key<Studente> key(long id) { 
     return Key.create(Studente.class, id); 
    } 

    List<Key<Categoria>> categorie; 

    public Studente() {} 

    @Id Long id; 
    @Index String nome; 
    @Index String cognome; 
    @Index String username; 
    @Index String password; 

    public Studente(String nome, String cognome, String username, String password) { 
     this.nome=nome; 
     this.cognome=cognome; 
     this.username=username; 
     this.password=password; 
     categorie = new ArrayList<Key<Categoria>>(); 
    } 

    public static long getNextID() { 
     return nextID; 
    } 

    public static void setNextID(long nextID) { 
     Studente.nextID = nextID; 
    } 

    public List<Key<Categoria>> getCategorie() { 
     return categorie; 
    } 

    public void setCategorie(List<Key<Categoria>> categorie) { 
     this.categorie = categorie; 
    } 

    public void addCategoria(Key<Categoria> k){ 
     categorie.add(k); 
    } 
} 

回答

0

我會建議有一個第三個實體與兩個實體索引引用。這樣,您就可以輕鬆查詢某個類別中的每個學生或每個學生的類別。

@Entity 
public class Student { /*...*/ } 

@Entity 
public class Category { /*...*/ } 

@Entity 
public class StudentCategory { 
    @Id 
    private Long id; 

    @Index 
    private Ref<Student> student; 

    @Index 
    private Ref<Category> category; 

    /*...*/ 
} 

我們已經在我們GAE應用類似的設置,並且它一直運作良好。

See documentation of Ref<?>

+0

在答案的同時,我做了一個示例工作代碼。你能檢查我的問題嗎? – Frank

+0

你的解決方案應該可以工作,但它不是很方便。 'Ref'比'Key'更方便(參見我鏈接的文檔)。此外,如果列表中沒有「@ Index」註釋,您將無法查詢具有某個類別的學生。你只能說出一個不同的學生有什麼類別。拋開一切,你的解決方案應該工作,是的。 –

+0

您可以在沒有中介'StudentCategory'實體的情況下,通過使用每個'Student'和'Category'中的參考列表來做同樣的事情。這將爲您節省額外的代碼和成本。 –

1

Student創建穆蒂值索引的字段包含所有Category ID(或鍵):

@Entity 
public class Category { 
    @Id 
    public Long id; // auto-generated Id of the Category 

} 

@Entity 
public class Student { 
    @Id 
    public Long id; // auto-generated Id of the Student 

    @Index 
    public List<Long> categories; // put Category Ids into this list 
} 

索引字段可以在查詢過濾器使用,所以你就可以搜索屬於某一類別的學生。

+0

在答案的同時,我做了一個示例工作代碼。你能檢查我的問題嗎? – Frank