如何在Java Spring Boot中将Int声明为外键

时间:2018-10-03 10:28:37

标签: java spring spring-boot jpa

因此默认情况下是这样的:

public class MyEntity{

   private int id;

   @OneToOneOrWhatever
   private MyOtherEntity other;

}

您可以简单地通过将对象添加到关系中来建立关系。但就我而言,急切加载整个对象实在是太过分了。我只想检索“ MyOtherEntity”的ID,仅此而已。 是这样的:

public class MyEntity{

    private int id;

   @SomeFancyAnnotationToRelateTo(MyOtherEntity.class)
   private int foreignKeyId;

}

可能吗?

2 个答案:

答案 0 :(得分:0)

这可以做到。

public class MyEntity{
    private int id;

    @OneToOne(fetch = FetchType.LAZY)
    @Fetch(FetchMode.JOIN)
    @JoinColumn(name = "myTypeId")
    private MyType myType;

}

答案 1 :(得分:0)

只需使用FetchType.LAZY

public class MyEntity{

   private int id;

   @ManyToOne(fetch = FetchType.LAZY)
   private MyOtherEntity other;

}

然后您可以通过myEntity.getMyOtherEntity().getId();

访问ID

一些解释: 如果在实体的属性上设置了延迟加载,则当Hibernate从数据库加载该实体时,与其创建适当的属性Object并从其自己的表中加载其所有属性,不如为该对象创建一个“代理”并仅在其中存储ID。

稍后当您第一次尝试访问该代理对象的任何属性时,它将识别出该对象未初始化,并且确实加载了该对象。

他们通常说,当您第一次访问该对象时,该对象将被加载。 但是“ id”字段是一个例外。它也已经存在于代理对象中! (这很合乎逻辑:为了从DB加载整个实体,无论如何都需要id)。 因此,只要您仅访问id字段,其他字段就不会加载。 (将无法访问OtherEntity的数据库表)

尽管创建了代理对象,并且在后台发生了一些其他的JPA /休眠魔术,但这仍然是访问id字段的最有效方法。 (此外,如果您以后再使用其他字段,则会自动加载它们)