ili*_*den 45 java mapping hibernate foreign-keys
目前,Hibernate允许我直接加载由*-to-one关系定义的对象
entity1.getEntity2()
Run Code Online (Sandbox Code Playgroud)
是否可以获取外键而不是对象?
我看到的当前方法是对我的映射添加addint:
@JoinColumn(name="message_key")
@ManyToOne(targetEntity=Message.class,fetch=FetchType.LAZY)
private Message message; //these lines currently exist
@Column(name="message_key")
private Long message_fk; //the idea is to add those 2 lines
Run Code Online (Sandbox Code Playgroud)
是否有更好的方法来获取外键,或者这是唯一的?
Aff*_*ffe 45
是的,你可以这样做.你只需要明确hibernate哪个是它应该维护的映射,如下所示:
@Column(name="message_key", updatable=false, insertable=false)
private Long message_fk;
Run Code Online (Sandbox Code Playgroud)
Mar*_*elo 15
如果您仍然希望引用您的实体但又不想从数据库加载它只是为了获取外键,那么您的方法是正确的.将insertable和updatabale = false添加到Column属性以防止丢失对实体的正确引用.
@JoinColumn(name = "message_key")
@ManyToOne(targetEntity = Messages.class, fetch = FetchType.LAZY)
private Messages message;
@Column(name = "message_key", insertable = false, updatable = false)
private Long message_fk;
Run Code Online (Sandbox Code Playgroud)
实际上,如果 FetchType 为 LAZY,则默认 Hibernate 行为仅加载外键而不是消息对象。这就是当您指定 LAZY FetchType 时要加载的对象的代理的原因。
外键不是直接可见的,但它当然是 OneToMany 关系“一”端的对象的键。
但是,对于基于字段的访问类型(例如,在您的情况下,将注释放置在字段上),存在一个未解决的休眠问题:Hibernate 从数据库加载代理后面的整个对象。(http://blog.xebia.com/2009/06/13/jpa-implementation-patterns-field-access-vs-property-access/)
我的具体建议是(例如,“正确”的答案在我的情况下不起作用):