我有一个带数据库的webapp,其中两个实体之间具有多对多关系,但是我手动实现了连接表。当其中一个实体被删除时,它将删除联接表中的所有条目并更新另一个实体,因此所有实体都可以正常工作,但是现在我应该为此功能编写一个测试。对于测试,我使用的是内存数据库,这实际上是唯一的区别,即调用具有相同批注(和层叠类型)的相同方法,但我不断得到:
org.hibernate.exception.ConstraintViolationException: integrity constraint violation: foreign key no action; FKC17477FD8940DF2B table ENTITY1_ENTITY2
我没有粘贴任何代码,因为我不相信它有任何问题,因为它可以正常工作。我不要求为我解决此问题,我只需要知道可能导致这种行为的原因,因为我已经用尽了所有想法,而且不知道还有什么可以寻找的...谢谢
编辑:这是一些代码:
@Entity
@Table(name = "interviewer")
public class Interviewer implements Identifiable {
@OneToMany(fetch = FetchType.EAGER)
@JoinColumn(name = "interviewer_id")
private Collection<InterviewerTechnology> technologies;
}
@Entity
@Table(name = "technology")
public class Technology implements Identifiable {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "technology_id")
private Collection<InterviewerTechnology> technologies;
}
@Entity
@Table(name = "interviewer_technology")
public class InterviewerTechnology implements Identifiable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.LAZY)
private Interviewer interviewer;
@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
private Technology technology;
}
@Component
public class TechnologyDao extends AbstractEntityDao<Technology> {
public void remove(Integer id) {
Technology technology = find(id);
em.remove(technology);
}
}
这段代码完全符合我的要求,似乎用于测试的数据库没有看到可以完成所有工作的CascadeType参数
我发现了问题,它是@Transactional
注释。我所有的测试DAOs
都扩展了DAO
带有注释的通用测试,@Transactional
而我又用盲目地对每个单个测试进行了注释DAO
。这里的问题是某些操作需要作为单个事务执行(可能需要flush()
在执行后执行),以便数据可立即用于其他操作。考虑以下示例:
@Transactional
public abstract class AbstractEntityDao<E> {
@PersistenceContext(unitName = "some-persistence")
protected EntityManager em;
public E create(E e) {
em.persist(e);
return e;
}
(...)
}
这意味着此类中的每个方法都是事务。现在,如果我们用另一个@Transactional
方法注释扩展该类的另一个类,则将是另一个事务,这意味着,如果我们在一个方法中删除多个事物,则它应该执行多个事务(flush()
为了执行级联,它们都需要被调用的方法),但是它们却被替代了。将作为一项交易运行(除非我们指定Propagation
)。让这成为每个人(尤其是我)的课程,以仔细考虑哪些操作需要单独的事务,哪些可以作为一个单独的事务执行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句