我在这里不知所措,也许这很明显,因为我的 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
来替换另一个并访问私人领域。我认为既然NewBar
is 也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
使其重新开始工作?为什么它一整天都在工作,然后我一夜之间就停止工作了?