JEE,JPA门面编辑多对多关系

时间:2017-03-17 21:02:29

标签: jpa java-ee

我正面临着一个我无法弄清楚的问题。

我有两个实体:用户和多对多关系的课程

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生成。

感谢您的帮助!

1 个答案:

答案 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。这意味着您需要像上面一样手动设置它。