2014-09-22 151 views
2

我有这样两个类之间的一个一对多的关系:在一个一对多的关系上创建列索引

class Parent { 
    List<Child> children; 
} 

class Child { 
    String name; 
} 

我使用的是.hbm.xml文件来定义Java类映射我到桌子。这样的事情:

<class name="Parent" table="parent"> 
    <list name="children"> 
     <key column="parent_id" /> 
     <list-index column="idx" /> 
     <one-to-many class="Child" /> 
    </list> 
</class> 

<class name="Child" table="child"> 
    <property name="name" type="string" /> 
</class> 

这工作正常。

现在我想在Child.parent_id列上创建列索引(不是列表索引)。看来,<one-to-many>标签不允许任何嵌套<column>标签,所以我尝试添加一个双向关联到Child这样的映射:

<many-to-one name="parent" insert="false" update="false"> 
    <column name="parent_id" index="true"> 
</many-to-one> 

但我得到一个异常:

org.hibernate.PropertyNotFoundException: Could not find a getter for parent in class Child 

所以,如何在Child.parent_id列上创建索引而不将parent字段添加到Child类中?我使用Hibernate 3.5.6和PostgreSQL 9.3。

+0

你如何想象在不存在的列上有索引? 如果您想拥有双向关联或索引,您需要在子类中拥有parent_id。 – 2014-09-22 07:50:28

+0

有一个'parent_id'列。它似乎是由''标签创建的。 – z0r 2014-09-23 08:48:19

回答

2

起初我没有明白你在找什么,但我想我知道了。

您定义了list-index,它用于保存java.util.List的索引,而不是Child的parent_id。所以你正在寻找如何创建真正的数据库索引。这可以通过像这样的注释来轻松完成;

@OneToMany(cascade = { CascadeType.ALL }) 
@JoinColumn(name="parent_id") 
@Index(name = "idx_parent_id", columnNames = "parent_id") 
private List<Child> images = new ArrayList<Child>(); 

而在xml配置会是什么样子,

<list name="children"> 
    <key> 
    <column index="parent_id_idx" name="parent_id"/> 
    </key> 
    <list-index column="idx"/> 
    <one-to-many class="hr.winkme.server.model.entities.Child"/> 
    </list> 

希望它能帮助。

+0

完美!感谢那。 – z0r 2014-09-23 23:57:18