簡體   English   中英

休眠-保持可嵌入資源

[英]Hibernate - persist embeddable resource

我剛剛開始使用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類不應是Entity,因為它不需要自己的類。

而且我更喜歡使用映射符號而不是XML文件。

因為它是我收到此錯誤:

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

通過創建包裝組內部的類並將其保存為可序列化到數據庫中的BLOB字段,可以將具有特定組的Resource的所有實例與Group本身保存到同一數據庫行中。

因為這樣的解決方案需要更多的代碼並產生混亂的數據模型,所以您不太可能真正希望限制自己只有一個表。

如您所說,如果Resource由Group完全擁有,並且您想通過某個字符串鍵訪問它們,那么包含可嵌入Resource實例的@ElementCollection是解決方案(假設您的Hibernate版本已經擁有它):

@ElementCollection
private Map<String, Resource> resources;

如果您沒有按名稱訪問資源的訪問集合,那么以下內容就足夠了

@ElementColection
private Set<Resource> resources;

有關微調元素的更多示例,請參見: Java Persistence / ElementCollection

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM