Hibernate - 持久嵌入资源

时间:2012-03-06 00:12:19

标签: java hibernate persistence

我刚刚开始使用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:

1 个答案:

答案 0 :(得分:0)

通过创建包装在组内的类并将其保存为Serializable到数据库中的BLOB字段,可以将属于某个Group的所有Resource实例保存到具有Group本身的同一数据库行。

由于这样的解决方案需要更多代码并产生令人困惑的数据模型,因此您不太可能只想限制自己只有一个表。

正如你所说,如果资源完全由Group拥有,并且你想通过某个字符串键访问它们,那么包含可嵌入资源实例的@ElementCollection就是解决方案(假设你的Hibernate版本已经拥有它):

@ElementCollection
private Map<String, Resource> resources;

如果您没有按名称访问资源的集合,那么以下就足够了

@ElementColection
private Set<Resource> resources;

有关微调元素集的更多示例,请参阅:Java Persistence/ElementCollection