JPA + Hibernate – 如何在不获取该实体的情况下获取子实体的FK?
我的问题的一个可能的答案位于: 如何从JPA ManyToOne映射中检索外键而不命中目标表?
但是,最好的解决方案(属性访问)在我的情况下不起作用(我失踪列exception – 为什么?)
该模型如下所示:实体Parent
和Child
。 表parent
具有列child_id
,它是child
表的PK
,因此它是典型的@ManyToOne
关系。
现在重点是,如果我获取Parent
实体,我需要访问FK
值(也就是Parent
实体的PK
)而不需要获取子实体。 我怎样才能做到这一点?
我使用Annotations
,我的映射看起来如下:
@Entity @Table(name = "parent") public class Parent extends AbstractEntity { @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "patent_id", nullable = true) private Child child; @Column(name="child_id",insertable=false,updatable=false) private Integer childId; public Child getChild() { return patent; } public void setChild(Child child) { this.child = child; } public Integer getChildId(){ return childId; } }
我想要做的是调用parent.getChild().getId()
而不从DB中获取Child
实体的额外提取。
根据我上面提到的答案,如果我将注释从字段移动到getter(在Parent
实体中我是对的吗?),请求的行为将是开箱即用的。 但是,当我将注释移动到getter时,我得到一个validationexception,即child
列丢失(好奇,为什么child
not child_id
声明?)
PS:将FK
列声明为单独字段的显示解决方法工作正常,但我不认为这是应该这样做的方式。
好了,看了下面的文章http://256stuff.com/gray/docs/misc/hibernate_lazy_field_access_annotations.shtml我已经意识到,属性访问应该是我想要获取的属性,而不是实际的child
对象。 因此,将AbstractEntity
id
访问权限从字段更改为属性,就可以了。
- 运行时的Hibernate配置
- 如何使用hibernate.properties文件而不是hibernate.cfg.xml
- 找不到元素’持久性’的声明
- 抢先并优雅地检查org.hibernate.Session是否仍然连接(通过c3p0)
- EclipseLinkJpaVendorAdapter而不是HibernateJpaVendorAdapter问题
- “本地事务已经有1个非XA资源:无法添加更多资源”错误
- java.lang.ClassNotFoundException:org.apache.log4j.Level
- 如何在Hibernate Interceptor中获取Hibernate会话?
- hibernate / webapp上下文中的对象相等