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

时间:2013-02-26 17:40:35

标签: java java-ee jpa relationship relation

我正在研究一个基本上由用户和文档组成的数据模型。现在,每次添加新文档时,只要特定用户没有看到它(例如点击它),就应该有一个标记将文档标识为“看不见”的标记。

您如何为这种情景建模?有没有办法将布尔/标志附加到用户和文档之间的关系?

这是我的简化模型:

@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 ...

}

非常感谢你的帮助!

2 个答案:

答案 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课程的一个重点。在答案中,描述了连接表中的实体及其主键。