我有一个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。
提前致谢。
答案 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中的双向关联。