仅发布单向多对一关系的ID

时间:2019-06-07 05:58:02

标签: java hibernate rest spring-boot jpa

我正在提交POST请求(JSON),以创建一个Person的新实例,并且每个Person必须具有与之关联的Status。有一个预填充的状态表,其状态数量有限。这里只是提交状态的实体ID的最佳方法?

当前,我仅在请求中提交Status实体的ID,但这意味着使用该ID从数据库加载状态,然后将其添加到临时Person之前,该持久Person可以满足JPA / DB约束,但是这效率低下。

请求正文(为简洁起见被截短)未编组到PersonDTO:

{
    "name" : "Dave",
    "statusId" : "1",
    ::
}

状态实体

@Entity
public class Status {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column
    private String status;
}

人员实体

@Entity
public class Person {

   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE)
   private Long id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "status_id")
    private Status status;
    ::

最好的方法实际上是在JSON请求中提交状态对象,这样我就不必对状态ID进行任何查找吗?

{
    "name" : "Dave",
    "status" : {
      "id" : 1
      "status" : "AVAILABLE"
    },
    ::
}

我很欣赏我可以在启动时将状态预加载为单例,以便可以访问它们或缓存使用ID返回状态的服务类方法,但是我想知道最好的方法是什么,因为如果我使用的是本机SQL我只能将Person带状态ID插入数据库中,而无需事先对状态进行任何查找。

1 个答案:

答案 0 :(得分:1)

1)一旦开始使用Native SQL,您将在越来越多的地方开始使用它。最终,您将失去JPA给您的数据库提供程序独立性。我并不是说这是100%不好,而是。.

2),您可以为Status应用二级缓存,因为它似乎是一种字典表:

@Entity
@Cacheable

3)如果您不希望对状态对象本身进行任何更改,则不应使用去数据库的findById来加载它,而应使用<相反,strong> getOne 只会创建一个参考,在您的情况下应该足够。