Hibernate - 外键而不是实体

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)

  • 以及如何指定此 ID 指的是哪个实体?数据库模式应该包含真正的外键约束,这是不可能从你的注释中识别出来的...... (3认同)
  • 建议是除了实体关系的正常完整映射之外还进行此映射,如原始问题所示. (2认同)

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)

  • 有人尝试过反之亦然,所以我只需要插入一个 id,hibernate 就能正确获取实体吗? (2认同)

Rob*_*rtG 5

实际上,如果 FetchType 为 LAZY,则默认 Hibernate 行为仅加载外键而不是消息对象。这就是当您指定 LAZY FetchType 时要加载的对象的代理的原因。

外键不是直接可见的,但它当然是 OneToMany 关系“一”端的对象的键。

但是,对于基于字段的访问类型(例如,在您的情况下,将注释放置在字段上),存在一个未解决的休眠问题:Hibernate 从数据库加载代理后面的整个对象。(http://blog.xebia.com/2009/06/13/jpa-implementation-patterns-field-access-vs-property-access/

我的具体建议是(例如,“正确”的答案在我的情况下不起作用):

  • 直接使用消息对象,因为 Hibernate 只会在需要非外键数据时加载它。不要为外键指定额外的字段。
  • 切换类以使用属性访问,即定义 getter 和 setter,并将您的注释从字段放到 getter。