2012-03-06 139 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