2012-08-07 47 views
0

我有一个Web应用程序访问一个名为“parent”的表的数据库。这位家长有孩子也可以是多个孩子的家长:Hibernate - 来自OneToMany的父子关系的参考列

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查询获得的该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:Row被另一个事务更新或删除(或未保存的值映射不正确):...”结束。

那么,什么是正确的方式来返回一个实体的“parent”的东西“物品”[数据库有一个'parent_id'的对象物品],如果该类物品本身没有得到该属性?我是所有这些东西的newby ... 数据库有一个每个Thing的parent_id字段,根父母为null,并且包含其他所有内容的父ID。

在此先感谢。

回答

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

+0

感谢您的快速回答! 让我们说,而不是“其中t.parent为空”我说“其中t.parent是45”。我想通过它的parent_id返回“东西”,这是一个Long值。我有点失落,试图做到这一点。 – Azurlake 2012-08-07 12:12:27

+0

'其中t.parent.id = 45'或者,如果你已经加载了具有ID 45的东西,其中t.parent =:parent','query.setParemeter(“parent”,theThingWithId45)'。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#queryhql-joins – 2012-08-07 12:14:50

+0

非常感谢。现在测试... – Azurlake 2012-08-07 12:21:23