我正在研究一个基本上由用户和文档组成的数据模型。现在,每次添加新文档时,只要特定用户没有看到它(例如点击它),就应该有一个标记将文档标识为“看不见”的标记。
您如何为这种情景建模?有没有办法将布尔/标志附加到用户和文档之间的关系?
这是我的简化模型:
@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 ...
}
非常感谢你的帮助!
答案 0 :(得分:1)
在Inbox
连接表中添加一个新列,存储“unseen”布尔值。然后是map the join table as new entity, and decompose the many-to-many association into two OneToMany associations。
答案 1 :(得分:1)
在JB Nizet的回答中,Matt对连接表的引用有一个唯一的主键(id
),一个对两个外键的唯一约束和一个附加列。这是一个很好的方法。
但是当您使用@ManyToMany
时,您最有可能拥有一个主键,该主键由连接表中的两个外键组成。如果您希望继续使用该模式并添加额外的viewed
列,您很可能需要习惯使用@Embeddable
类来将复合主键反映在{{1 }}。请记住,当您这样做时,您需要覆盖@Entity
/ equals
。
您可以将my answer on the other question视为创建hashcode
课程的一个重点。在答案中,描述了连接表中的实体及其主键。