簡體   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