[英]How persist Map<String, Embeddable type> using hibernate in mySQL
[英]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.