@NotNull 在 class 上被忽略
@NotNull ignored on class
我有一个实体:
@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 自动生成的 table:
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 自动生成的 table:
FIELD TYPE NULL KEY DEFAULT
ID BIGINT(19) NO PRI NULL
OLD_ID VARCHAR(255) YES UNI NULL
SIZE INTEGER(10) NO NULL
您必须在调用 entityManager.save()
之后调用 entityManager.flush()
。
否则,将不会抛出异常,也不会在您的测试中提取异常。
这是一个完整的工作示例:
我的实体:
@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);
}
}
试试这个,在我的情况下按预期工作。
@Column(name = "size", nullable = false)
@NotNull(message= "size may not be empty.")
private Integer size;
我有一个实体:
@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 自动生成的 table:
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 自动生成的 table:
FIELD TYPE NULL KEY DEFAULT
ID BIGINT(19) NO PRI NULL
OLD_ID VARCHAR(255) YES UNI NULL
SIZE INTEGER(10) NO NULL
您必须在调用 entityManager.save()
之后调用 entityManager.flush()
。
否则,将不会抛出异常,也不会在您的测试中提取异常。
这是一个完整的工作示例:
我的实体:
@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);
}
}
试试这个,在我的情况下按预期工作。
@Column(name = "size", nullable = false)
@NotNull(message= "size may not be empty.")
private Integer size;