休眠一对多的映射工作与列表,但不是一组? [英] Hibernate one to many mapping works with a list but not a set?
问题描述
很抱歉打扰 - 也许这是一个非常简单的问题 - 但由于某种原因,以下版本无法解析,而带有set的版本正常工作。事实上,如果我只是采取设置的版本,并用列表替换集我得到:
嵌套异常是org.hibernate.InvalidMappingException:无法解析映射文档从无效映射
谢谢
Misha
<! - - 双向一对多关联到SpreadsheetImportTemplateColumn - >
< list name =columns>
<! -
cascade =all-delete-orphansort =natural
order-by =无效asc,首选desc,date_created desc>
- >
< key column =template_idnot-null =true/>
<! -
<一对多等级=SpreadsheetImportTemplateColumn/>
< / set>
- >
< / list>
您说过
而设置的版本正常工作
这里列出DOCTYPE
<!ELEMENT list(
meta *,
subselect ?,
cache ?,
同步*,
评论,
键,
(index | list-index),
(元素|一对多|多对多|复合
loader,sql-insert?,sql-update?,sql-delete?,sql-delete-all?,
filter *
) >
你可以看到,list元素需要index或list-index元素,一个关键要素,以及以下其中一项:
- 元素
- 一对多
- 多对多
- 组合元素
- 多对多
这里是列表索引DOCTYPE
< ;! - 声明集合索引(数组或列表索引或映射键)的类型和列映射。 - >
<!ELEMENT list-index(column?)>
<!ATTLIST list-index列CDATA#IMPLIED>
<!ATTLIST list-index base CDATA0>
所以你应该使用
< list name =columns>
< key column =template_idnot-null =true/>
< list-index column =哪一列应该用作索引/>
<一对多课程=SpreadsheetImportTemplateColumn/>
< / list>
但是如果您想使用列表而不是集合,并且没有列表 - 索引列,您可以改用袋子。初始化如下
集合< SpreadsheetImportTemplateColumn> columns = new ArrayList< SpreadsheetImportTemplateColumn>();
定义这个映射而不是
< bag name =columns>
< key column =template_idnot-null =true/>
<一对多课程=SpreadsheetImportTemplateColumn/>
< / bag>
Sorry to bother - perhaps this is a very simple question - but for some reason the version below fails to get parsed, whereas the version with set works fine. In fact, if I just take the set version and replace set with list I get:
nested exception is org.hibernate.InvalidMappingException: Could not parse mapping document from invalid mapping
Thank you Misha
<!-- bi-directional one-to-many association to SpreadsheetImportTemplateColumn --> <list name="columns"> <!-- <set name="columns" lazy="false" inverse="true" cascade="all-delete-orphan" sort="natural" order-by="voided asc, preferred desc, date_created desc"> --> <key column="template_id" not-null="true" /> <!-- <one-to-many class="SpreadsheetImportTemplateColumn" /> </set> --> </list>
解决方案You said
whereas the version with set works fine
Here goes list DOCTYPE
<!ELEMENT list ( meta*, subselect?, cache?, synchronize*, comment?, key, (index|list-index), (element|one-to-many|many-to-many|composite-element|many-to-any), loader?,sql-insert?,sql-update?,sql-delete?,sql-delete-all?, filter* )>
Ass you can see, list element needs either index or list-index element, a key element, and one of the following
- element
- one-to-many
- many-to-many
- composite-element
- many-to-any
Here goes list-index DOCTYPE
<!-- Declares the type and column mapping for a collection index (array or list index, or key of a map). --> <!ELEMENT list-index (column?)> <!ATTLIST list-index column CDATA #IMPLIED> <!ATTLIST list-index base CDATA "0">
So you should use
<list name="columns"> <key column="template_id" not-null="true"/> <list-index column="WHICH COLUMN SHOULD BE USED AS INDEX"/> <one-to-many class="SpreadsheetImportTemplateColumn" /> </list>
But if you want to use a list instead of a set and does not have a list-index column, you can use a bag instead. Initialize as follows
Collection<SpreadsheetImportTemplateColumn> columns = new ArrayList<SpreadsheetImportTemplateColumn>();
And define this mapping instead
<bag name="columns"> <key column="template_id" not-null="true"/> <one-to-many class="SpreadsheetImportTemplateColumn"/> </bag>
这篇关于休眠一对多的映射工作与列表,但不是一组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!