Quarkus Panache 实体不在存储库中
Quarkus Panache entity not in repository
我的应用程序中有一个 Book 模型 class,如下所示:
@Entity
public class Book extends PanacheEntity{
public String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
在我的测试 class 中,我创建了这个 class 的实例并调用了 persistAndFlush()。接下来,我放心地向控制器发起 HTTP 调用。我将新创建和保留的实体的 ID 作为路径参数传递给控制器。
@QuarkusTest
public class GreetingResourceTest {
@Test
@Transactional
public void testBookEndpoint() {
Book book= new Book();
book.title="Quarkus is awesome";
book.persistAndFlush();
assertTrue(book.isPersistent());
given()
.when().get("/hello/"+book.id)
.then()
.statusCode(200)
.body(is("Quarkus is awesome"));
}
}
控制器获取请求成功。它收到书和 id。但是:当控制器查询数据库时,实体不存在。
完整代码如下:
@Path("/hello")
public class GreetingResource {
@GET
@Path("/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getBook(@PathParam("id") Long id) {
Book book=Book.findById(id);
return book.title; //NullPointerException. Book cannot be found
}
}
Book.findById(id)
returns 空。为什么?
此问题是由涉及的交易的可见性引起的。虽然有对 book.persistAndFlush()
的调用,但事务包装 public void testBookEndpoint()
尚未提交。因此,public String getBook(@PathParam("id") Long id)
.
的交易暂时还看不到新书
您需要确保插入书籍的事务在测试 rest 端点之前已提交,以确保新书在数据库中对检索它的 rest 调用可见,例如
@QuarkusTest
public class GreetingResourceTest {
static Book book;
@BeforeAll
@Transactional
public static void setupEntities(){
book = new Book();
book.title="Quarkus is awesome";
book.persistAndFlush();
assertTrue(book.isPersistent());
}
@Test
public void testBookEndpoint() {
given()
.when().get("/hello/"+book.id)
.then()
.statusCode(200)
.body(is("Quarkus is awesome"));
}
}
我的应用程序中有一个 Book 模型 class,如下所示:
@Entity
public class Book extends PanacheEntity{
public String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
在我的测试 class 中,我创建了这个 class 的实例并调用了 persistAndFlush()。接下来,我放心地向控制器发起 HTTP 调用。我将新创建和保留的实体的 ID 作为路径参数传递给控制器。
@QuarkusTest
public class GreetingResourceTest {
@Test
@Transactional
public void testBookEndpoint() {
Book book= new Book();
book.title="Quarkus is awesome";
book.persistAndFlush();
assertTrue(book.isPersistent());
given()
.when().get("/hello/"+book.id)
.then()
.statusCode(200)
.body(is("Quarkus is awesome"));
}
}
控制器获取请求成功。它收到书和 id。但是:当控制器查询数据库时,实体不存在。
完整代码如下:
@Path("/hello")
public class GreetingResource {
@GET
@Path("/{id}")
@Produces(MediaType.TEXT_PLAIN)
public String getBook(@PathParam("id") Long id) {
Book book=Book.findById(id);
return book.title; //NullPointerException. Book cannot be found
}
}
Book.findById(id)
returns 空。为什么?
此问题是由涉及的交易的可见性引起的。虽然有对 book.persistAndFlush()
的调用,但事务包装 public void testBookEndpoint()
尚未提交。因此,public String getBook(@PathParam("id") Long id)
.
您需要确保插入书籍的事务在测试 rest 端点之前已提交,以确保新书在数据库中对检索它的 rest 调用可见,例如
@QuarkusTest
public class GreetingResourceTest {
static Book book;
@BeforeAll
@Transactional
public static void setupEntities(){
book = new Book();
book.title="Quarkus is awesome";
book.persistAndFlush();
assertTrue(book.isPersistent());
}
@Test
public void testBookEndpoint() {
given()
.when().get("/hello/"+book.id)
.then()
.statusCode(200)
.body(is("Quarkus is awesome"));
}
}