我有一个实体:
@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
答案 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;