0

我使用 JPA/Hibernate 处理 WildFly Web 项目。在我开发这个软件的过程中,我对 Hibernate 怀有强烈的热情,就像其他许多人一样。我希望我一开始就没有使用它,但是该项目现在太远了,无法改变方法。我解决了许多愚蠢的怪癖和“功能不是错误”,但现在我只剩下一个了,这让我发疯了。

我有一个名为 GenericPerson 的 bean,它可以有许多“角色”(如客户、用户等)。每个角色都在自己的数据库表中,并通过主键 (id) 与父人员相关联。当然,除非我真的需要角色,否则我不想加载角色,所以我继续使用 Hibernate 的延迟加载功能。对于@OnoToOne 关系,似乎必须使用字节码检测。所以我通过 Maven 实现了它,它可以工作。这是代码示例。

@Entity
@Table(schema="public", name="generic_person")
public class GenericPerson extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    ...

    // Bidirectional one-to-one association to User
    @OneToOne(optional=true, fetch=FetchType.LAZY)
    @LazyToOne(value=LazyToOneOption.NO_PROXY)
    @PrimaryKeyJoinColumn
    @JsonView(JacksonViews.EagerLoad.class)
    @JsonManagedReference("user")
    private User user;

    ...
}

@Entity
@Table(name="user")
public class User extends BaseEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    ...

    @OneToOne(mappedBy="user", optional=false)
    @JsonBackReference("user")
    private GenericPerson genericPerson;

    ...
}

现在,如果我不需要有关用户的信息(因此永远不要延迟初始化“用户”字段),一切都很好。如果我想使用急切加载并且此 GenericPerson 的用户存在,也可以。但是,如果关联的用户不存在,当 RestEasy 通过 Jackson 序列化 bean 时,我得到异常:

org.hibernate.PropertyAccessException:
could not get a field value by reflection getter of User.id

好吧,当然不能,亲爱的 Hibernate,用户不存在!当类没有被增强(所以没有延迟加载)时,这不会发生。我尝试将 mappedBy 属性和 @PrimaryKeyJoinColumn 注释从一侧切换到另一侧,但没有帮助。有谁知道如何解决这个问题?也欢迎替代设计理念(使用@OneToOne)。

4

1 回答 1

0

有趣的事情。出于完全不相关的原因,我决定将所有注释从字段移到 getter 方法。一旦我这样做了,这个问题就消失了。我希望这对处于类似情况的人有所帮助。

于 2014-03-30T20:31:37.213 回答