- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个表:User
和 Loan
。用户有 3 个字段:id
(PK)、first_name
和 last_name
。 Loan
表的字段 user_id
是 User
表的外键:
我的应用程序的逻辑:当我创建新的 Loan
对象并设置相应的 user
时,它应该为唯一用户创建一个新对象或设置一个 将
转换为现有用户的用户
的iduser_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 持久保存到数据库。但是当我尝试添加现有的一个时,我遇到了异常:
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)
时,我只能输入现有用户,因为只有我传递一个未保留在数据库中的新用户时,我遇到了异常:
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)
效果不佳。
更新
插入新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);
}
}
最佳答案
如果您调用坚持贷款a) 在用户关系上设置了cascade.Persist并且引用的用户存在,如果没有从同一个EntityManager实例/上下文读入用户实例,您将得到一个异常 - 您正在通过userService读取它,然后保存贷款在贷款服务中,因此上下文必须由容器管理并在同一事务中才能工作。
b) 如果未设置cascade.PERSIST(或cascade.ALL)并且引用用户是新的,您将收到“找到新对象”异常。
如果您无法在要保存贷款的同一个 EntityManager 中执行用户读取,则切换到使用合并可能会有所帮助,因为 JPA 随后应检查引用的实体并根据需要进行合并。然后,您需要在关系上设置cascade.MERGE 选项,以便将合并应用到User 实例。
请注意,使用合并与持久不同,因为您传入的内容不会由上下文管理。这意味着事务提交后,传入的实体仍然没有设置任何主键值。如果您要继续将实体用于任何其他操作,您可能需要传回从合并返回的实体。
关于java - JPA 多对一关系 CascadeType 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36757723/
我有一个简单的 hibernate OneToOne 程序。它包含一个 导师类(class)和讲师详情 类(class)。 OneToOne 映射定义为从 Instructor 到 Instructo
我搜索了答案,但无法正确找到答案。当我们设置FetchType.EAGER时,CascadeType.ALL、cascade = CascadeType.REMOVE、orphanRemoval有什么
当我尝试运行以下代码时,出现 org.hibernate.TransientObjectException: object references an unsaved transient instan
使用 JPA 我有一个关于 CascadeTypes 的问题。 例如: @ManyToMany(fetch=FetchType.LAZY, cascade={CascadeType.PERSIST,
我正在尝试通过我的 REST-api 向数据库添加一个新的员工实体。 Employee-entity 包含一个 City 属性。这是一个 ManyToOne 关系。当我插入一个新的(不存在的)城市的新
我有两个域类。下面是类的粗略草图。 Company.java public class Company{ @OneToMany(orphanRemoval="true",cascade=Cas
我有两个类: Employee.java @Entity @Table public class Employee { @Id @GeneratedValue private
@OneToMany 注释中插入的 CascadeType 选项与 @Cascade 中插入的 CascadeType 选项有什么区别?哪一个优先,两者之一被忽略吗? @OneToMany(m
我有两个类,彼此之间具有单向一对多关系。 public class Offer{ ... @OneToMany(cascade=CascadeType.ALL) @JoinTa
我有一个相当简单的设置,其中有一个 UserEntity 和一个相应的 UserStatisticEntity。我希望这是一个单向关系,其中 UserEntity 持有引用。 UserStatisti
考虑这个用例。 class Category { @OneToMany(cascade=CascadeType.ALL) List applications = new ArrayList
我有以下代码(当然是经过简化的): @Entity public class Foo { @Generated private Long id; @OneToMany(mappe
我有一个 Entity,其双向 ManyToMany 关系(在同一实体上)标记为 CascadeType.ALL。 以下是查找 Contact 实体的方式: @ManyToMany(cascade=
我现在有点困惑。我有三个表:specialPrice、partner、product。 在specialPrice中,我可以存储可供所选合作伙伴使用的产品的折扣。所以它只有三列。合作伙伴和产品表及其行
我有 OneToMany 双向关系实体类(WorkOrder 和 Task)。 WorkOrder 有一个或多个Task。当我通过query 删除WorkOrder 实体时,出现外键约束异常。 Ent
我现在想知道 Hibernate 中的 CascadeType 和 FetchType 有什么区别? 它们看起来很相似,但我猜它们不能互换,对吧?什么时候使用它们?它们可以同时使用吗? 最佳答案 这是
对于 JPA,我在实体类中定义 Cascade Type 和 orphanRemoval 设置等内容时遇到问题。对我来说,在实体上定义 Cascade Type 和 orphanRemoval 是有限
我认为我在某个地方犯了错误: 有 2 个实体(删除所有无用字段): 1。玩家(许多玩家 -> 在 1 队中) @Component @Entity @Table(name = "player") pu
在多线程环境中, 这有效 Box box = new Box("B"); Toy t1 = box.addNewToy("t1"); Toy t2 = box.addNewToy("t2"); syn
CascadeType.REFRESH 实际上做了什么? 它的定义是 When we refresh an entity all the entities held in this field ref
我是一名优秀的程序员,十分优秀!