【问题标题】:Hibernate not fetching public memberHibernate 不获取公共成员
【发布时间】:2010-11-07 23:50:36
【问题描述】:

考虑以下代码:

@Entity
@Table(name = "a")
public class A implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    public int id;

    @Transient
    public B b;

    public B getB()
    {
        return B;
    }
}

当我获取 A 时,我正在手动填充 B(另一个休眠实体)。如果我尝试使用 a.b 访问,那么它会失败,但是,如果我使用 a.getB();然后就成功了。

这是为什么?

【问题讨论】:

    标签: java hibernate transient


    【解决方案1】:
    1. 班级成员永远应该是私人的!
    2. 如果您的对象附加到 Hibernate 会话,则您正在使用代理。因此,如果您想直接访问您的类成员(这很糟糕!),您必须先分离对象。

    【讨论】:

    • 我假设您的意思是类成员应该始终是私有的,是的,我同意,但是我继承了这段代码并且必须更改 JSP 中的数千个引用,所以这不太可能发生.
    • 好吧,那么我希望混乱的架构不是你的错;)。但是您是否尝试过分离对象?我想,基于这样的架构,使用了 OpenSessionInViewFilter(或(反)“模式”)),因此对象不会在请求中分离。您必须记住,实际对象是一个代理,对成员和方法的访问依赖于持久性管理器的策略或实现。并且 Hibernate 假设遵循一些规则,比如不直接访问成员。
    • 我实际上是在尝试修复架构。我尝试在检索对象后将其逐出,但在我尝试访问任何内容后,我得到的只是以下异常:org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    • 我最终将所有内容都设为私有,并花了三天时间筛选 JSP,但它最终解决了我的问题。
    【解决方案2】:

    听起来像是一个懒惰的抓取问题。当您尝试直接访问公共引用时,它为空,但是当您使用“get”进行访问时,Hibernate 知道调用数据库并为您水合该实例。

    【讨论】:

    • 对我来说也是这样,只是我可以调用 a.getB(),然后调用 a.b,但 a.b 仍然失败。
    【解决方案3】:

    因为 b 字段是瞬态的。

    是否需要它是暂时的?尝试删除它。

    【讨论】:

    • 唯一需要它是暂时的是我不希望数据库中的链接。
    猜你喜欢
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 2017-11-23
    • 2013-06-23
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多