我正在用Quarkus和PanacheRepository做一些测试,但是在更新实体数据时遇到了麻烦。更新不起作用,字段值也未更新。
简而言之:我创建了一个实体并保留了数据,然后在另一个请求中,我使用repository.findById(id);
从数据库中获取了该实体,更改了某些字段值,但是新值未保留在数据库中。我尝试在之后致电repository.persist(person);
,但行为相同,数据未更新。
我在Quarkus 1.9.0.Final,1.9.0.CR1、1.8.3.Final版本中尝试过
我正在使用postgreSQL12。我还尝试了mysql 5.7.26
我仅使用Eclipse 2020-06(4.16.0)编写代码,并在命令行中使用以下命令运行该应用程序:./mvnw compile quarkus:dev
我创建了一个全新的简单应用程序,其行为是相同的。以下是主要配置和一些代码段:
pom.xml
<properties>
<compiler-plugin.version>3.8.1</compiler-plugin.version>
<maven.compiler.parameters>true</maven.compiler.parameters>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus-plugin.version>1.9.0.Final</quarkus-plugin.version>
<quarkus.platform.artifact-id>quarkus-universe-bom</quarkus.platform.artifact-id>
<quarkus.platform.group-id>io.quarkus</quarkus.platform.group-id>
<quarkus.platform.version>1.9.0.Final</quarkus.platform.version>
<surefire-plugin.version>3.0.0-M5</surefire-plugin.version>
</properties>
<dependencies>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm-panache</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
</dependencies>
application.properties:
quarkus.datasource.db-kind = postgresql
quarkus.datasource.username = theusername
quarkus.datasource.password = thepassword
quarkus.datasource.jdbc.url = jdbc:postgresql://localhost:5432/testpanache
# drop and create the database at startup (use `update` to only update the schema)
quarkus.hibernate-orm.database.generation = drop-and-create
实体:
@Entity
public class Person {
@Id @GeneratedValue public Long id;
public String name;
@Override
public String toString() {
return "Person [id=" + id + ", name= '" + name + "']";
}
}
REST资源:
@Path("/people")
@Produces(MediaType.APPLICATION_JSON)
public class PersonResource {
@Inject
PersonRepository repository;
@GET
@Produces(MediaType.TEXT_PLAIN)
public List<Person> hello() {
return repository.listAll();
}
@POST
@Transactional
public void create() {
Person person = new Person();
person.name = "some name";
repository.persist(person);
}
@PUT
@Path("{id}")
@Transactional
public Person update(@PathParam("id") Long id) {
Person person = repository.findById(id);
person.name = "updated updated updated"; // does not work
// repository.persist(person); // does not work
// repository.persistAndFlush(person); // does not work
repository.getEntityManager().merge(person); // does not work
return person;
}
}
存储库:
@ApplicationScoped
public class PersonRepository implements PanacheRepository<Person> {
}
我使用curl发出了一些请求以演示行为:
$ curl -w "\n" http://localhost:8080/people
[]
$ curl -X POST http://localhost:8080/people
$ curl -w "\n" http://localhost:8080/people
[{"id":1,"name":"some name"}]
$ curl -X PUT http://localhost:8080/people/1
{"id":1,"name":"updated updated updated"}
$ curl -w "\n" http://localhost:8080/people
[{"id":1,"name":"some name"}]
因此,列表开始为空,第二个POST请求创建一个具有“某些名称”的Person,如第三个请求所示;第四个请求执行了一个PUT,目的是将名称更改为“更新的更新的更新的”,但是第五个请求显示名称未更新。
尽管不需要,但我尝试了repository.persist(person);
,repository.persistAndFlush(person);
甚至repository.getEntityManager().merge(person);
(每次一次),如上面PersonResource
片段中所示。但是它们都没有生效。
我缺少什么?
PS ::我尝试将我的实体更改为扩展PanacheEntity
,并使用Person.findById(id);
来找到该实体,这样,后续更新确实生效了。但这不是我的意思,我想使用PanacheRepository并想了解我所缺少的内容。
答案 0 :(得分:1)
请考虑使用getter / setter访问您的实体,以便Hibernate Proxies可以正常工作。
@Entity
public class Person {
@Id @GeneratedValue public Long id;
private String name; // <--- private field
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name= '" + name + "']";
}
}
并在您的资源中:
@PUT
@Path("{id}")
@Transactional
public Person update(@PathParam("id") Long id) {
Person person = repository.findById(id);
person.setName("updated updated updated"); // <--- this way works
repository.persist(person);
return person;
}