我有一个名为AbstractUser
的抽象类和两个子类Organisation
和User
。 Organisation
与User
相同,但附加功能。
我还有一个名为notes
Organisation
可以创建notes
user
可以保存笔记。所以备注属于一个Organisation
,但可以通过很多user
个对象
是否可以正确设置notes
两者与user
的ManyToMany关系以及与组织的ManyToOne关系?
我非常喜欢下面的关系,
note_user note_organisation
note_id user_id id(incremented) note_id organisation_id
1 4 1 1 2
1 3 2 2 2
2 3 3 3 3
这是我到目前为止所得到的。 组织:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long OrganisationId;
@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL })
@JoinTable(name = "organisation_note", joinColumns = { @JoinColumn(name = "OrganisationId") }, inverseJoinColumns = { @JoinColumn(name = "note_id") })
private Set<Note> bookmarks = new HashSet<>();
用户:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long userId;
@ManyToMany( fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST } )
@JoinTable(
name = "user_note",
joinColumns = {@JoinColumn(name = "userId")},
inverseJoinColumns = {@JoinColumn(name = "note_id")})
private Set<Note> notes = new HashSet<>();
请注意:
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long projectId;
//Is this even necessary? I never save users to notes
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL )
private Set<User> users = new HashSet<>();
以上作品。但它表现得非常奇怪。当我创建笔记或向用户保存笔记时,我会一直得到重复的行。这也允许我用组织对象创建两个音符,但第三个会给我一个错误,说明主要的重复键,与创建的第一个音符相同的主键。我能做些什么使我的代码更加一致和可靠吗?
保存对象:
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.persist(entity);
try {
session.flush();
} catch (Exception e) {
System.out.println("Error flushing");
}
session.getTransaction().commit();