我正在提交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插入数据库中,而无需事先对状态进行任何查找。
答案 0 :(得分:1)
1)一旦开始使用Native SQL,您将在越来越多的地方开始使用它。最终,您将失去JPA给您的数据库提供程序独立性。我并不是说这是100%不好,而是。.
2),您可以为Status
应用二级缓存,因为它似乎是一种字典表:
@Entity
@Cacheable
3)如果您不希望对状态对象本身进行任何更改,则不应使用去数据库的findById
来加载它,而应使用<相反,strong> getOne
只会创建一个参考,在您的情况下应该足够。