【发布时间】:2015-03-13 20:23:34
【问题描述】:
几天前,我在 Hibernate 中遇到了一个奇怪的行为,无法说出为什么突然出现。
有两个表共享单向 1:n 关系。有一个包含 n 条记录的记录目录。在某些情况下,我无法发现只加载了一条记录。没有出现错误消息。也没有警告。
其实这是很简单的东西,总是用来工作的。 (本文末尾的对象代码)
到目前为止,我只能说如果 Record-Catalog 的 ID 为 78,则只会加载一条记录。对于其他 ID,它似乎没问题。
我正在这样获取我的 RC-Object:
public String getCatalog(){
Session session = null;
try {
SessionFactory factory = HibernateUtil.getSessionFactory();
session = factory.openSession();
Transaction tx = session.beginTransaction();
String hql = "SELECT R FROM rcatalog.Rcatalog as R WHERE rcatalogID_PK = " + rcid;
Query query = session.createQuery(hql);
return getOutputForPage(query.list().get(0)); //If I get the size of the records it's 1 here
} catch (HibernateException | java.lang.IndexOutOfBoundsException hibex) {
Logger.getLogger(BasisHibernate.class.getName()).log(Level.INFO, "Rcid: {0}", rcid);
Logger.getLogger(BasisHibernate.class.getName()).log(Level.SEVERE, null, hibex);
} finally {
try {
if (session != null) {
session.close();
}
} catch (HibernateException | NullPointerException hibex) {
}
}
return "";
}
到目前为止,这对我来说似乎没问题。 ID是正确的。我决定打开 sql 输出并获得以下行 (M_ID --> 目录的 ID D_ID --> 记录的 ID ):
Hibernate: select myrecord0_.M_ID as M65_9_1_, myrecord0_.D_ID as D1_1_, myrecord0_.D_ID as D1_7_0_ from [MyProj].[dbo].[MyRecord] myrecord0_ where myrecord0_.M_ID=?
通过使用 SQL Server Management Studio 中的查询,我得到了按预期列出的记录数量。
到目前为止,我已尝试删除出现的单个记录,但行为保持不变。
我已经做了一些研究,但不太成功:
- Hibernate only loads one object from a list
- 完全不同的错误
http://www.coderanch.com/t/442282/ORM/databases/Hibernate-loads-element-collection
- 我认为我们没有同样的问题
- 未使用任何限制
- 有趣的文章,但我尝试将惰性转换为渴望,正在重新启动我的服务器,重建项目。还是一样
这是我的课程(如前所述,我没有使用 FetchType.EAGER。这仅用于测试目的)
@Entity
@Table(name = "[MyProj].[dbo].[Rcatalog]")
public class Rcatalog implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "M_ID")
private Integer RcatalogID_PK;
@ManyToOne()
@JoinColumn(name = "W_ID", insertable = false, updatable = false)
private UpperElement upperelement;
@Column(name = "W_ID")
@JoinColumn(name = "upperelementID_FK", referencedColumnName = "upperelementID_PK")
private Integer upperelementID_FK;
@OneToMany(mappedBy = "myrecordID_FK", fetch = FetchType.EAGER)
@Sort(type = SortType.COMPARATOR, comparator = MyRecordComparator.class)
private SortedSet<MyRecord> myrecord = new TreeSet<>();
//Constructor, Getter, Setter...
}
还有记录:
@Entity
@Table(name = "[MyProj].[dbo].[MyRecord]")
public class MyRecord implements Serializable, PartElementInterface {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "D_ID")
private Integer myrecordID_PK;
@Column(name = "M_ID")
@JoinColumn(name = "myrecordID_FK", referencedColumnName = "myrecordID_PK")
private Integer myrecordID_FK;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "M_ID", insertable = false, updatable = false, nullable = true)
private Rcatalog rcatalog;
//Constructor, Getter, Setter and some more stuff
}
我的 Hibernate-core 版本是 3.6.10.Final
【问题讨论】:
标签: java sql-server hibernate