让我们考虑拥有这样的三个DTO。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = true)
private Long id;
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", nullable=false)
private Set<UserElement> userElements;
}
@Entity
@Table(name = "element")
public class Element {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = true)
private Long id;
}
@Entity
@Table(name = "user_element")
public class UserElement {
public UserElement (User user, Element element) {
this.user = user;
this.element = element;
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id", unique = true, nullable = true)
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", updatable = false, insertable = false, nullable=false)
private User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "element_id")
private Element element;
}
我们假设在表user_element的数据库中我当前有一行:user_id = 1,element_id = 1;
给定代码:
List<UserElement> userElements = Lists.newArrayList();
User user = session.get(User.class, 1);
Element element1 = session.get(Element.class, 1);
Element element2 = session.get(Element.class, 2);
userElements.add(new UserElement(user, element1));
userElements.add(new UserElement(user, element2));
user.setUserElements(userElements);
session.merge(user);
我原本希望在我的桌子中有两行: user_id = 1,element_id = 1,user_id = 1,element_id = 2, 但相反,我得到了ConstraintViolationException。我究竟做错了什么?我不能简单地提供userElements的集合吗?