考虑这样的 Book 实体:
@Entity
public class Book {
@Id @GeneratedValue
private Long id;
private String title;
private String ISBN;
@ManyToMany // ommiting mapping details
private Set<Author> bookAuthors;
// getters, setters, etc.
}
我们可能有用于特定目的的 DTO,例如在网页上显示数据
public class BookDto {
private String title;
private String ISBN;
private Set<Author> bookAuthors;
// getters, setters, etc.
}
如果我错了,请纠正我,但好的做法是隐藏 ID,这意味着在这种情况下,不要在 DTO 中包含 ID 字段?
如果是,那么我们假设我们有“列出所有书籍”页面,在该页面上我们显示有关书籍的详细信息,并提供“编辑书籍数据”按钮(或删除,或任何形式的操作单个条目的数据),这应该调用特定书籍的编码功能。对我来说,它看起来像这样(不隐藏 ID,因为这是正确识别非唯一标题书的唯一方法):
<button type="button" onclick="editBookDetails(id)">Edit book details</button>
但正如之前提到的 - 我们应该将 ID 隐藏得尽可能深,并避免将其暴露在表层。但是这样的功能应该怎么写呢?如果不是通过其唯一 ID,如何识别要编辑的条目?假设我们隐藏了 ID,构建此类操作的最佳实践是什么?也许有一些我不知道的方法。
附注是的,我知道,ISBN 有点独特。但还有许多其他数据示例不是书籍,并且没有像书籍那样可以安全公开的“公共”唯一 ID。
好的做法是隐藏 ID正如评论中所讨论的,不,你的前提是不正确的。将 ID 值包含为实体的一部分并没有什么问题。
事实上,如果您打算进一步工作,您
必须携带 ID 值。例如,当呈现一个对象列表供用户编辑或删除时,您将需要 ID 来区分哪个对象是哪个。毕竟ID是标识符,标识哪个对象需要编辑或删除。
也许抑制显示display 中隐藏该值。在幕后,您的应用程序仍然需要识别一个对象与另一个对象。
例如,当在表格网格中列出对象时,类中的每个字段都有一列,您可以选择禁止显示 ID 列。但您仍然需要该 ID 值才能进行如上所述的编辑/删除。