繁体   English   中英

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

[英]Posting just the id of unidirectional many to one relationship

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

当前,我仅在请求中提交Status实体的ID,但这意味着使用该ID从数据库加载状态,然后将其添加到临时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,我可以只需将带有状态ID的Person插入数据库中,而无需事先对状态进行任何查找。

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

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

@Entity
@Cacheable

3)如果您不希望对状态对象本身进行任何更改,则不应该使用findById来加载状态对象,后者会进入数据库,而应使用getOne代替,后者只会创建一个引用,在您的情况下就足够了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM