【发布时间】:2012-09-29 13:00:05
【问题描述】:
我在使用 Hibernate 从数据库中获取行时遇到问题。当我只想得到一行时,我收到了 20 行。当我想从大约 1.5k 行的表中获取所有行时,我正好收到 15.2k 行。 该表的实体类具有复合主键。
这是我获取所有行的代码:
Criteria criteria = getSession().createCriteria(type);
criteria.setCacheable(true).setCacheRegion(BaseEntity.PACKAGE);
criteria.list();
这是我的实体类:
@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {
@EmbeddedId
private MyPK id;
@Column(name = "text", nullable = false)
protected String text;
@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;
@Override
public MyPK getId() {
return id;
}
@Override
public void setId(MyPK id) {
this.id = id;
}
//getters and setter
}
这是MyPK类:
@Embeddable
public class MyPK implements Serializable {
@Column(name = "qwerty")
protected String qwerty;
@Column(name = "property")
protected String property;
//constructors, getters and setters
}
MyEntity 类是带有@MappedSuperclass 注释的抽象类。这是这个类头:
@MappedSuperclass
public abstract class MyEntity<T extends Serializable>
我做错了什么? EmbeddedId 有这个问题吗?
编辑 #1 正如我已经意识到这是问题所在:
@ManyToOne
@JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
protected Option option;
此对象包含另一个表的外键。而这个另一个表引用了另一个。最后一张表有 10 行用于上一张表。结果我得到行数量 * 10。问题可能出在我的实体中的 Hibernate 注释。
【问题讨论】:
-
返回的对象都是同一个实例吗?意思是你得到了 20 个完全相同的对象引用吗?
-
@SteveEbersole:我想是的。我明天会检查,因为目前我不能。我从 Hibernate 控制台检查了 sql,我意识到 Hibernate 正在从数据库中获取其他几个表。这些表当然是通过外键连接的。但我不知道为什么简单地从一个表中获取所有行,我的代码得到的附加表很少。对于数据库中的一行,我得到十行作为查询结果。
-
@SteveEbersole :我已经检查过了。我为一个对象获取 10 个实例,为另一个对象获取 10 个实例。
标签: java hibernate persistence criteria