在类上忽略@NotNull

时间:2018-07-18 09:49:49

标签: java hibernate jpa spring-data bean-validation

我有一个实体:

@Entity
public class MyEntity {

  @Id
  private String Id;

  @NotNull
  @Column(nullable = false)
  private Integer size;

  public void setSize(Integer size) { this.size = size; }
  public Integer getSize() { return this.size; }

  public void setId(String id) { this.id = id; }
  public String getId() { return this.id; }
}

存储库:

@Repository
public class MyEntityDAO {

  @PersistenceContext
  private EntityManager em;

  public void create(MyEntity myEntity) {
    em.persist(myEntity);
  }
}

应该引发异常的测试:

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class MyEntityDAOTest {

  @Inject 
  private MyEntityDAO myEntityDAO;

  @Test(expected = ConstraintViolationException.class)
  public void nullSizeNotAllowedTest() {
    MyEntity myEntity = new MyEntity();
    myEntity.setSize(null);
    myEntity.setId("entity_id");
    myEntityDAO.create(myEntity);
  }
}

但是测试失败。实体不会引发必需的异常。注释对字符串有效,但对整数无效。

为MyEntity自动生成的表:

FIELD   TYPE            NULL    KEY     DEFAULT  
ID      VARCHAR(255)    NO      PRI     NULL
SIZE    INTEGER(10)     NO              NULL

更新

当我在@GeneratedValue(strategy = ...)字段中指定Id时,一切正常。但是,我希望能够将自己的值分配给“主键”字段。

更新2

更新的实体(存储库也进行了更新以反映更改):

@Entity
public class MyEntity {

  @Id
  private Long Id;

  @NaturalId
  private String oldId;

  @NotNull
  @Column(nullable = false)
  private Integer size;

  /* getters and setters */
}

为MyEntity自动生成的表:

FIELD   TYPE            NULL    KEY     DEFAULT  
ID      BIGINT(19)      NO      PRI     NULL
OLD_ID  VARCHAR(255)    YES     UNI     NULL
SIZE    INTEGER(10)     NO              NULL

2 个答案:

答案 0 :(得分:1)

您必须在致电entityManager.flush()之后致电entityManager.save()

否则,将不会引发异常,也不会在测试中发现异常。

这是一个完整的示例:

MyEntity:

@Entity
public class MyEntity {

    @Id
    private String id;

    @Column(nullable = false)
    @NotNull
    private Integer size;

    public MyEntity(){}

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Integer getSize() {
        return size;
    }

    public void setSize(Integer size) {
         this.size = size;
    }
}

MyEntityDAO:

@Repository
public class MyEntityDAO {

     @PersistenceContext
     private EntityManager entityManager;

     public void save(MyEntity myEntity){
          entityManager.persist(myEntity);
          entityManager.flush();
     }
}

MyEntityDAOTest:

@RunWith(SpringRunner.class)
@Transactional
@SpringBootTest
public class MyEntityDAOTest {

    @Autowired
    private MyEntityDAO myEntityDAO;

    @Test(expected = ConstraintViolationException.class)
    public void nullSizeNotAllowedTest() throws Exception {
        MyEntity myEntity = new MyEntity();
        myEntity.setId("testId");
        myEntity.setSize(null);
        myEntityDAO.save(myEntity);
    }
}

答案 1 :(得分:0)

尝试一下,按我的情况工作。

@Column(name = "size", nullable = false)
@NotNull(message= "size may not be empty.")
private Integer size;