我有一个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。
在此先感谢。
感谢您的快速回答! 让我们说,而不是“其中t.parent为空”我说“其中t.parent是45”。我想通过它的parent_id返回“东西”,这是一个Long值。我有点失落,试图做到这一点。 – Azurlake 2012-08-07 12:12:27
'其中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
非常感谢。现在测试... – Azurlake 2012-08-07 12:21:23