我有2个表格:User
和Loan
。用户有3个字段:id
(PK),first_name
和last_name
。 Loan
表有场user_id
是外键User
表: JPA多对一关系CascadeType行为
我的应用程序的逻辑:当我创造新的Loan
对象,并设置有相应的user
应建立新的独特的用户一个新的或设置id
user
纳入现有用户的user_id
。
为此,我的数据库在first_name
,last_name
上有一个唯一索引。
的Loan
类使用User
与@ManyToOne
关系:
public class Loan {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinColumn(name = "user_id")
private User user;
... methods ...
当我添加新用户,一切都很好,它坚持用新的PK为DB。但是,当我尝试添加一个现有的我和异常:
javax.servlet.ServletException: org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.0.v20150309-bf26070): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'FIRST_LAST_NAME' defined on 'USER'.
Error Code: 20000
当我再次把@ManyToOne(cascade = CascadeType.MERGE)
我只能够进入现有的用户,因为只有我通过未在DB我坚持一个新的得到一个例外:
javax.servlet.ServletException: org.springframework.dao.InvalidDataAccessApiUsageException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: User{id=null, firstName='a', lastName='a'}.;
@ManyToOne(cascade = CascadeType.ALL)
没有工作。
UPDATE
插入代码的新Loan
是:
user = userService.findByName(firstName, lastName);
if (user == null) {
user = new User(firstName, lastName);
}
loan.setUser(user);
loanService.save(loan);
findByName()
和save()
方法是:
private EntityManager em;
public User findByName(String firstName, String lastName) {
TypedQuery<User> query = em.createQuery(
"SELECT u FROM User u WHERE u.firstName = :firstName " +
"AND u.lastName = :lastName", User.class)
.setParameter("firstName", firstName).setParameter("lastName", lastName);
List<User> users = query.getResultList();
if (!users.isEmpty()) {
return users.iterator().next();
} else {
return null;
}
}
public void save(User user) {
if (user.getId() == null) {
em.persist(user);
} else {
em.merge(user);
}
}
向我们显示您的代码插入。 –
请张贴用户类的代码。 – LearningPhase
我更新了问题,谢谢 – DimaSan