我刚刚开始使用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:
答案 0 :(得分:0)
通过创建包装在组内的类并将其保存为Serializable到数据库中的BLOB字段,可以将属于某个Group的所有Resource实例保存到具有Group本身的同一数据库行。
由于这样的解决方案需要更多代码并产生令人困惑的数据模型,因此您不太可能只想限制自己只有一个表。
正如你所说,如果资源完全由Group拥有,并且你想通过某个字符串键访问它们,那么包含可嵌入资源实例的@ElementCollection就是解决方案(假设你的Hibernate版本已经拥有它):
@ElementCollection
private Map<String, Resource> resources;
如果您没有按名称访问资源的集合,那么以下就足够了
@ElementColection
private Set<Resource> resources;
有关微调元素集的更多示例,请参阅:Java Persistence/ElementCollection