Java 休眠不获取公共成员

Java 休眠不获取公共成员,java,hibernate,transient,Java,Hibernate,Transient,考虑以下代码: @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() { r

考虑以下代码:

@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(另一个hibernate实体)。如果我尝试使用a.b访问,那么它会失败,但是,如果我使用a.getB();然后它成功了


这是为什么?

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

  • 班级成员应该是私人的
  • 如果您的对象已附加到Hibernate会话,则您正在使用代理。因此,如果希望直接访问类成员(这很糟糕!),则必须首先分离对象

  • 因为b场是瞬态的


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

    我也这么认为,只是我可以调用a.getB(),然后调用a.b,但a.b仍然失败。它只是暂时的,我不想在数据库中使用该链接。我假设你的意思是类成员应该始终是私有的,是的,我同意,但是我继承了这段代码,不得不在JSP中更改数千个引用,所以这不太可能发生。但是你有没有试着分离这个物体?我想,基于这样的体系结构,使用了OpenSessionInViewFilter(或(反)模式),因此不会在请求中分离对象。您必须记住,实际对象是一个代理,对成员和方法的访问依赖于持久性管理器的策略或实现。Hibernate假设遵循了一些规则,比如不直接访问成员。实际上,我正在尝试修复架构。我尝试在检索对象后将其逐出,但在我尝试访问任何对象后,得到的只是以下异常:org.hibernate.LazyInitializationException:无法初始化代理-没有SessionI最终将所有内容都设置为私有,并花了三天时间筛选JSP,但它最终解决了我的问题。