H2 - 当 Persistable<ID> isNewObject 设置为 true 时

我在 Java Spring Boot 应用程序中使用 H2 作为测试数据库,但是当我想在尝试插入重复的 ID/PK 时捕获“重复键”异常时,H2 不会抛出任何内容。


有了邮递员,一切都很好,我就是无法通过测试。


真正的数据库是 PostgreSQL,当我与 Postman 集成测试时,它确实抛出异常。但是在单元测试时我认为没有必要加载真正的DB所以我选择了H2。


H2配置:


spring.datasource.url=jdbc:h2:mem:tesdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;mode=MySQL

spring.datasource.driverClassName=org.h2.Driver

spring.datasource.username=sa

spring.datasource.password=


spring.datasource.testWhileIdle=true

spring.datasource.validationQuery=SELECT 1


spring.jpa.datasource.show-sql=true

spring.h2.console.enabled=true # if you need console

豆定义:


@Entity

@Data

@JsonComponent

@Table(name="bin_info")

public class BinInfo implements Serializable, Persistable<String>{ //with Persistable we can check ID duplicate

    @Id

    @Size(min=6, max=8)

    @Column(name="bin")

    @JsonProperty("bin")

    private String bin;


    ...


    /**

     * Property for identifying whether the object is new or old,

     * will insert(new) or update(old)

     * If is new and id/bin is duplicate, org.hibernate.exception.ConstraintViolationException will be thrown.

     * If is old and id/bin is duplicate, just updates. Hibernate save() will upsert and no complain.

     */

    @Transient

    private boolean isNewObject;


    @Override

    public String getId() {

        return this.bin;

    }


    @Override

    public boolean isNew() {

        return isNewObject;

    }

    @Override

    public String getId() {

        return this.bin;

    }


    @Override

    public boolean isNew() {

        return isNewObject;

    }


catspeake
浏览 185回答 2
2回答

缥缈止盈

如果您调用save()现有实体,Hibernate 不会再次保留它,而只会更新该实体。

凤凰求蛊

最后我中止了这个测试,并通过不检查异常来绕过它。它仍然是一个错误。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java