jakarta ee-Java-ee-6:如何在@ManyToMany和@ManyToOne关系中存储布尔值



我正在开发一个基本上由用户和文档组成的数据模型。现在,每次添加新文档时,都应该有一个标志,将某个文档标识为"看不见",只要特定用户没有看到它(例如单击它(。

你会如何模拟这样的场景?是否有一种方法可以将布尔值/标志附加到用户和文档之间的关系?

这是我的简化模型:

@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关联。

最新更新