Hibernate - 来自OneToMany的父子关系中的参考列

时间:2012-08-07 11:52:44

标签: hibernate one-to-many

我有一个Web应用程序访问一个名为“parent”的表的数据库。这个父母有孩子,也可以是更多孩子的父母:

public class Thing extends Entity{

  @OneToMany(cascade = {CascadeType.ALL})
  @JoinColumn(name = "parent_id")
  private List<Thing> children = new ArrayList<Thing>();

  @Column
  private String property;

  public String getProperty() { return property; }
  public void setProperty(String property) { this.property = property; }

实体已获得PK属性:

@Id
@Column(nullable = false)
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;

现在,我想从HQL查询访问Thing的parent_id属性。如果我这样做:

[Another class]
Query queryParents = getEntityManager().createQuery("from Thing t where t.parent_id is null");

我收到错误消息称该属性不存在。好吧,我将以下内容添加到Thing类中:

@Column
private Long parent_id;
public Long getParent_id() { return parent_id; }
public void setParent_id(Long parent_id) { this.parent_id = parent_id; }

这似乎有效,但我认为这是不正确的,因为它们没有引用同一个实体......事实上,尝试更新Thing对象,最终会出现在“org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):...“。

那么,返回实体“Thing”的parent_id属性的正确方法是什么?[如果类Thing本身没有获得属性,数据库有一个对象Thing的列'parent_id']?我是所有这些东西的新手...... 数据库的每个Thing都有一个parent_id字段,对于root父项是null,并且包含其他所有内容的父ID。

提前致谢。

1 个答案:

答案 0 :(得分:1)

使您的关联双向:

@OneToMany(mappedBy = "parent")
private List<Thing> children;

@ManyToOne
@JoinColumn(name = "parent_id")
private Thing parent;

查询只是

select t from Thing t where t.parent is null

返回父ID将是:

Long parentId = thing.getParent() == null ? null : thing.getParent().getId();

详细了解the Hibernate documentation中的双向关联。