以一对多关系在列上创建索引

时间:2014-09-22 07:24:55

标签: java hibernate postgresql orm

我在这两个类之间有一对多的关系:

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。

1 个答案:

答案 0 :(得分:4)

起初我没有得到你想要的东西,但我想我想出来了。

您定义了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>

希望它有所帮助。