我有一个实体:
@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(策略=...)
指定到
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
试试这个,在我的案例中,效果如预期。
@Column(name = "size", nullable = false)
@NotNull(message= "size may not be empty.")
private Integer size;
您必须调用entityManager.flush()
后调用entityManager.save()
。
否则,将不会抛出异常,也不会在测试中拾取异常。
下面是一个完整的工作示例:
我的实体:
@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);
}
}
问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc
问题内容: 我正在编写一个使用Oracle JDBC驱动程序的Java程序。我已经在我的类路径中设置了它。当我在IDE中运行程序(作为jdbc作为库添加)时,程序运行正常。当我尝试部署它时,它完全忽略了classpath中的清单,并给了我一个NoClassDefFoundError。 我想使用客户端的JDBC驱动程序(已安装的JDBC驱动程序),并且不提供自己的驱动程序。我打包了来自JDevelo
问题内容: 我正在尝试为api 编写Web服务。因此,我编写了一个MyLogRecord类,该类继承自LogRecord。我用JAX- B注释对此类进行了注释,包括,因此它将忽略未注释的字段和属性。当我启动tomcat时,出现错误,并且其他类没有默认的构造函数,但是没有带注释的方法对Level类或任何其他类进行任何引用。这些由父类引用。 我的子类具有需要定义的所有内容。如何使JAX-B完全忽略父类
我正在开发一个REST API,使用Spring Boot启动数据Rest。我想与JPA同步的一个类是User类,其中包含有关用户的信息,包括谁被允许访问API。 不幸的是,拥有用户和UserRepository意味着我的用户类在API中公开。我能够删除Id(在configureRepositoryRestConfiguration函数中)、用户名和密码(通过向我的用户类的每个变量添加@JsonI
问题内容: 鉴于以下课程, 假设在调用ClassOne.main之后还有其他事情要做,则下面的类也将被破坏。 有没有办法忽略System.exit(1); ClassTwo的调用中对ClassOne的了解? 问题答案: 您 本身 不能忽略它,但是可以防止它通过SecurityManager终止JVM。查看此问题以获取详细的代码示例。