gpt4 book ai didi

Hibernate 换出用于迁移现有数据的可嵌入类

转载 作者:行者123 更新时间:2023-12-04 16:00:31 25 4
gpt4 key购买 nike

我在这里不知所措,也许这很明显,因为我的 Hibernate 专业知识比其他领域要弱。

在遗留代码中有一个 Hibernate @Entity类(class) 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 做一些事情。 ,但是最初的设计有限制,并且这个字段是私有(private)的,阻止我继承它,所以我不得不创建一个完整的其他类, NewBar , 替换另一个并访问私有(private)字段。我以为自从 NewBar也是 Embeddable并具有相同的 @Column指定,我可以换掉类中的字段 Foo :
private NewBar bar = new NewBar();

我想这样做是因为我在 foobar 中有现有数据列,我想通过 NewBar 透明地使用这些数据而不是 OldBar .

通过跟踪日志,我看到 Foo()已创建,其默认版本为 NewBar() ,正如人们所期望的那样,当调用构造函数时。但是,按时间码调用 Foo.getBar() , 出于某种原因 barnull !我假设 Hibernate 将其设置为 null出于某种原因——但是为什么 Hibernate 不从 foobar 读取数据?列并创建 NewBar 的实例?为什么当我输入 OldBar 时它又开始工作了回到 NewBar 的位置?当然,数据库本身并没有说明 @Embeddable 中的哪一个。类被映射到列,是吗?

更新:这变得越来越陌生。有时我会让代码过夜,第二天它就可以工作了!或者第二天就不行了!刚才不行(即 foobar属性设置为 null而不是数据库中的值),所以我做了类 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 (user) 表有一行包含正确的数据,最重要的是 foobar字段有数据。为什么 Hibernate 给我返回一个 Foonull foobar field ?为什么简单地从 NewBar 切换至 OtherBar让它重新开始工作?为什么它一整天都在工作,然后我一夜之间就停止工作了?

最佳答案

这可能是答案;我将不得不等待几天,看看它是否确实解决了这个问题。实际上有两个部分。

首先,为了全面披露,我的NewBar class 实际上是 AbstractBar 的子类.我最终想要有不同类型的可嵌入条,所以我放置了 @EmbeddableAbstractBar水平,不在 NewBar级别,并放置私有(private) foobar AbstractBar 的字段水平也是如此。有趣的是,这在某些时候奏效了。正如我所提到的,有时我会在第二天回来,而 Hibernate 不会加载 foobar field 。我不明白为什么它不是一直有效或一直无效。

其次,当我试图摆脱这种层次结构以消除问题的一个根源时,我将 AbstractBar 混为一谈。和 NewBar但忘记带@Embeddable高于 AbstractBarNewBar ,所以 Hibernate 没有看到这是一个可嵌入的类,也不知道如何将字符串加载到 NewBar 中。没有 @Embeddable 的字段指定。这就是为什么OtherBar (带有 @Embeddable 注释)有效,但不是 NewBar (没有 @Embeddable 注释)。这点我明白了。为什么 Hibernate 没有警告我它无法弄清楚如何加载字段,我不知道。

总而言之,如果您离开 @Embeddable,Hibernate 将不会加载可嵌入字段。注释掉类。至于原来的问题,我只能猜测@Embeddable尝试在类层次结构上使用它时会出现问题,并且最好将所有可嵌入字段保持在可嵌入类中的一个级别。我希望这就是问题所在。我们明天看看它是否继续工作。

关于Hibernate 换出用于迁移现有数据的可嵌入类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10166656/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com