我正在开发一个基本上由用户和文档组成的数据模型。现在,每次添加新文档时,都应该有一个标志,将某个文档标识为"看不见",只要特定用户没有看到它(例如单击它(。
你会如何模拟这样的场景?是否有一种方法可以将布尔值/标志附加到用户和文档之间的关系?
这是我的简化模型:
@Entity
@Table(name="User")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@Column(length = 128)
private String name;
@ManyToMany(mappedBy = "users", fetch=FetchType.LAZY)
private List<Document> documents = new ArrayList<Document>();
// getters and setters ...
}
这是文档类:
@Entity
@Table(name = "Document")
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name = "Inbox", joinColumns = @JoinColumn(name = "document_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
protected List<User> users = new ArrayList<User>();
// getters and setters ...
}
非常感谢你的帮助!
在JB Nizet的回答中,Matt对联接表的引用有一个唯一的主键(id
(、两个外键上的一个唯一约束和一个附加列。这是一条很好的路。
但是,当您使用@ManyToMany
时,您最有可能拥有一个主键,该主键由联接表中的两个外键组成。如果您希望继续使用该模式并添加一个额外的viewed
列,那么您很可能需要习惯使用@Embeddable
类,以便在@Entity
中反映复合主键。记住,这样做时,需要覆盖equals
/hashcode
。
您可以将我对另一个问题的回答作为创建@Entity
类的起点。答案中描述了联接表中的实体及其主键。
在Inbox
联接表中添加一个新列,存储"看不见的"布尔值。然后将联接表映射为新实体,并将多对多关联分解为两个OneToMany关联。