2012-03-06 142 views
1

我剛剛開始使用Hibernate ORM學習Java數據庫持久性,並遇到了一個我無法解決的問題。休眠 - 堅持嵌入式資源

我有以下兩類:

@Embeddable 
public class Resource { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Resource() { 
    } 
} 

@Entity 
public class Group { 

    @Embedded 
    private Map<String, Resource> resources; 

    @Id 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Map<String, Resource> getResources() { 
     return resources; 
    } 

    public void setResources(Map<String, Resource> resources) { 
     this.resources = resources; 
    } 

    public Group() { 
     resources = new HashMap<String, Resource>(); 
    } 
} 

資源不應該有自己的表,因爲它不應該在集團範圍之外存在。這就是爲什麼我使用Embeddable作爲組件處理的原因。

總結我想知道如何使用Hibernate ORM將這些類存儲在數據庫中。 Resource類不應該是一個實體,因爲它不需要它自己的類。

我寧願使用映射符號而不使用XML文件。

因爲它是我得到這個錯誤:

Syntax error in SQL statement "INSERT INTO GROUP[*] (NAME) VALUES (?) "; expected "identifier"; SQL statement: 
+0

如果一個組可以有多個資源,那麼您希望如何在不創建另一個表的情況下存儲它們? – Affe 2012-03-06 00:15:45

+0

不能像任何其他屬性一樣被序列化嗎?像一個字符串? 還是我得到嵌入錯誤? – 2012-03-06 00:17:39

+0

@doubter - 嵌入式集合需要單獨的表進行存儲。原因應該非常明顯 - 集合表示主實體和嵌入式實體之間的一對多關係,它不能(在一個表中)(正確)表示。 – Perception 2012-03-06 00:20:50

回答

0

有可能通過創建類的內部組包裝並保存它保存屬於某些集團與集團本身相同的數據庫行資源的所有實例作爲序列化到數據庫中的BLOB字段。

因爲這樣的解決方案需要更多的代碼併產生令人困惑的數據模型,所以您不太可能僅限於自己只有一個表。

如果像你說的,資源完全由集團擁有並且要通過一些字符串鍵來訪問它們,然後@ElementCollection包含嵌入資源的情況下被解決(假設你的Hibernate的版本已經擁有它):

@ElementCollection 
private Map<String, Resource> resources; 

如果你沒有資源的訪問收集的名字,那麼以下就足夠了

@ElementColection 
private Set<Resource> resources; 

有關微調更多的例子你的元素集合可以發現:Java Persistence/ElementCollection

+0

感謝您的回覆......但考慮到我必須使用的Hibernate版本只有CollectionOfElement ...您認爲它也可以工作嗎? (jbpm自帶的Hibernate版本) – 2012-03-06 08:21:53

+0

是的,它完美的作品! – 2012-03-06 13:00:27