我在这里不知所措,也许这很明显,因为我的 Hibernate 专业知识比其他领域要弱。
在遗留代码中有一个 Hibernate@Entity类Foo。它的属性之一是:
private OldBar bar = new OldBar();
OldBar是一个@Embeddable使用单列的类,foobar:
@Embeddable
public class OldBar {
private String fooBar;
@Column(length = 10, nullable = false)
private String getFooBar() {
return fooBar;
}
@SuppressWarnings("unused")
private void setFooBar(String fooBar) {
this.fooBar = fooBar;
}
}
最初的问题是我需要对 做一些事情OldBar.fooBar,但最初的设计有限制并且这个字段是私有的,阻止我对其进行子类化,所以我不得不创建一个完整的另一个类,NewBar来替换另一个并访问私人领域。我认为既然NewBaris 也Embeddable具有相同的@Column名称,我可以换掉类中的字段Foo:
private NewBar bar = new NewBar();
我想这样做是因为我在foobar列中有现有数据,并且我想透明地使用这些数据NewBar而不是OldBar.
通过跟踪日志,我看到它是在调用构造函数时创建的,正如人们所期望的那样,Foo()它的默认版本是 。NewBar()但是,按时间码来电Foo.getBar(),不知bar为何null!我假设 Hibernatenull出于某种原因将其设置为 --- 但为什么 Hibernate 不从foobar列中读取数据并创建一个实例NewBar?OldBar为什么当我放回原位时它又开始工作了NewBar?当然,数据库本身没有说明哪些@Embeddable类映射到列,是吗?
更新:这变得越来越陌生。有时我会让代码过夜,第二天它就可以工作了!或者第二天就不行了!刚才不行(就是把foobar属性设置为,null而不是数据库中的值),所以我做了class ExactCopyOfOldBar,把OldBar. 效果很好!所以我切换回NewBar--- 只是撤销我的临时更改。它仍然有效,以前没有!是否存在某种缓存,其中 Hibernate 序列化值并且不从数据库中获取它们?这很奇怪。
更新:现在我根本不能NewBar上班了。我创建了 ,除了它有一个不同的名称之外,它OtherBar基本上相同,我将它插入并且它可以正常工作,正确读取嵌入的字符串。NewBar我切换回NewBar,我又得到null了。到底是怎么回事?
请注意,Foo正在通过 加载net.databinder.auth.hib.AuthDataApplication.getUser(String username),这很简单:
return (DataUser) Databinder.getHibernateSession().createCriteria(getUserClass())
.add(Restrictions.eq("username", username)).uniqueResult();
我一遍又一遍地验证Foo(用户)表有一行包含正确的数据,最重要的是该foobar字段有数据。为什么 Hibernate 给我Foo一个null foobar字段?为什么简单地从切换NewBar到OtherBar使其重新开始工作?为什么它一整天都在工作,然后我一夜之间就停止工作了?