我使用JPA / Hibernate处理WildFly Web项目。在我开发这个软件的过程中,我开始厌恶Hibernate的热情,正如许多其他人所做的那样。我希望我没有首先使用它,但是项目现在已经太过改变了方法。我解决了很多愚蠢的怪癖和“功能不是一个bug”,但现在我只剩下一个了,这让我发疯了。
我有一个名为GenericPerson的bean,它可以有许多“角色”(如Customer,User等)。每个角色都在自己的数据库表中,并通过主键(id)与父人关联。当然,我不想加载角色,除非我真的需要它们,所以我继续使用Hibernate的延迟加载功能。对于@OnoToOne关系,似乎必须使用bytecode instrumentation。所以我通过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)也是受欢迎的。
答案 0 :(得分:0)