我正面临着一个我无法弄清楚的问题。
我有两个实体:用户和多对多关系的课程
User.java
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
@ManyToMany(cascade = CascadeType.MERGE)
@JoinTable(
name="USR_COURSES",
joinColumns=@JoinColumn(name="USR_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="COURSE_ID",referencedColumnName="ID"))
private List<Course> courses;
...
Course.java
@Entity
@Table(uniqueConstraints=@UniqueConstraint(columnNames="CODE"))
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String code;
private String name;
private String content;
@ManyToMany(mappedBy="courses",cascade = CascadeType.MERGE)
private List<User> users;
...
如果我创建了一个用户并为他设置了一些课程,那么将使用用户和课程之间的新关系更新连接表。
但是,如果我想通过添加课程来编辑用户,则联接表不会更新:
List<Course> test = myUser.getCourse();
test.add(facade.find(1l));
myUser.setCourse(test);
userFacade.edit(myUser);
我正在使用NetBean和AbstractFacade生成。
感谢您的帮助!
答案 0 :(得分:0)
为了在这种情况下级联工作,您需要在ManyToMany关系的两侧设置依赖关系。
这意味着您需要执行以下操作:
List<Course> test = myUser.getCourse();
Course course = facade.find(1l);
course.getUsers().add(myUser);
test.add(course);
myUser.setCourse(test);
userFacade.edit(myUser);
当您查询课程时,您没有获得用户列表,因为您只在该关系上设置了Cascade.MERGE。这意味着您需要像上面一样手动设置它。