CascadeType在内存数据库中不起作用

卢卡斯

我有一个带数据库的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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

播放框架,内存数据库中的PostgreSQL,间隔不起作用

来自分类Dev

数据库播种器在Laravel中不起作用

来自分类Dev

导入的Sqlite数据库在Android中不起作用

来自分类Dev

mysql数据库在xampp 1.8.3中不起作用

来自分类Dev

在CodeIgniter中从数据库检索值不起作用

来自分类Dev

where()在codeigniter数据库中不起作用

来自分类Dev

导入的Sqlite数据库在Android中不起作用

来自分类Dev

数据库播种器在Laravel中不起作用

来自分类Dev

数据库连接在Express中不起作用

来自分类Dev

更新 derby 数据库中的记录不起作用

来自分类Dev

从 Firebase 数据库中删除子项不起作用

来自分类Dev

数据库在primefaces中不起作用

来自分类Dev

插入数据库不起作用

来自分类Dev

sqlite数据库不起作用

来自分类Dev

插入数据库不起作用

来自分类Dev

lmdb(Symas Lightning内存映射数据库)在CentOS上不起作用

来自分类Dev

在内存数据库中创建的最佳方法?

来自分类Dev

PostgreSQL在内存数据库Django中

来自分类Dev

Peewee Sqlite 在内存数据库中的共享

来自分类Dev

在内存中加载数据库

来自分类Dev

在内存中加载数据库

来自分类Dev

如何为每个测试在内存数据库中创建单独的数据库?

来自分类Dev

SQLite3在数据库中插入数据在C中不起作用

来自分类Dev

将数据插入数据库不起作用

来自分类Dev

从SQLite数据库删除数据不起作用

来自分类Dev

PHP从数据库获取数据不起作用

来自分类Dev

使用PDO查看数据库中的数据不起作用

来自分类Dev

从数据库中获取数据时,选择查询不起作用

来自分类Dev

即使 SQLite 数据库中存在数据,登录也不起作用

Related 相关文章

热门标签

归档