gpt4 book ai didi

java - @DataJpaTest 不识别嵌入式 id 中的非空限制

转载 作者:行者123 更新时间:2023-12-05 07:23:52 25 4
gpt4 key购买 nike

我正在尝试使用 @DataJpaTest 设置我的数据库单元测试注释以避免加载完整的 Spring 应用程序上下文。但它的执行方式与我使用 @SpringBootTest 时的方式不同。 + 配置的 H2 数据库。当我使用 H2 数据库时,我在尝试保存具有空 ID 的实体时收到适当的异常。

JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID_PART_2"

但是当我使用通过 @DataJpaTest 自动配置的数据库时如所述here

By default, it configures an in-memory embedded database, scans for @Entity classes, and configures Spring Data JPA repositories

存储库允许插入具有空 ID 的实体。

我的实体代码是:

package com.mycompany.test.db;

import lombok.Data;

import javax.persistence.*;
import java.io.Serializable;

@Data
@Entity
@Table(name = "MY_TABLE", schema = "MY_SCHEMA")
public class MyEntity {

//Works fine when using @Id
// @Id
// @Column(name = "ID", nullable = false)
// private String id;

@EmbeddedId
private MyId myId;

@Data
@Embeddable
public static class MyId implements Serializable {

//Single field reproduces the problem
// @Column(name = "ID_PART_1", nullable = false)
// private String idPart1;
@Column(name = "ID_PART_2", nullable = false)
private String idPart2;
}
}

我正在使用基本的 CRUD 存储库 CrudRepository<MyEntity, MyEntity.MyId>

我的测试代码如下所示:

package com.mycompany.test.db;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest//works as expected
//@DataJpaTest//doesn't work
public class MyRepositoryTest {

@Autowired
private MyRepository repository;

private MyEntity.MyId createMyId(String part1, String part2){
MyEntity.MyId myId = new MyEntity.MyId();
// myId.setIdPart1(part1);
myId.setIdPart2(part2);
return myId;
}

@Test
public void testSaveAndRead(){
MyEntity entity = new MyEntity();
entity.setMyId(createMyId("part1", "part2"));

repository.save(entity);
Assert.assertNotNull(repository.findById(createMyId("part1", "part2")));
}

@Test
public void testSaveWithNoPrimaryKeyFails(){
try{
MyEntity entity = new MyEntity();
entity.setMyId(createMyId("part1", null));
repository.save(entity);
Assert.fail();
}catch(Exception expected){
expected.printStackTrace();
}
}
}

我还尝试禁用使用 @DataJpaTest 自动配置的数据库通过添加 @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)但它并没有改变任何东西。

注意:问题仅发生在嵌入的 ID 上。对于我在堆栈跟踪中看到的内容,如果是 javax.persistence.Id在尝试将此类实体保存到数据库之前,Spring JPA 验证失败。

为什么使用 @DataJpaTest 时行为不同?和 @SpringBootTest ?使用@DataJpaTest时使用的是什么数据库?我认为如果 Spring 在这两种情况下都使用 H2,问题就会得到解决,但我不知道如何实现。

最佳答案

这可以通过将下面这行添加到测试类中来解决

@org.springframework.transaction.annotation.Transactional(propagation = Propagation.NOT_SUPPORTED)

关于java - @DataJpaTest 不识别嵌入式 id 中的非空限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55729160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com