java - 使用 Quarkus 和 PanacheRepository 更新实体数据不起作用

标签 java hibernate quarkus quarkus-panache

我正在使用 Quarkus 和 PanacheRepository 进行一些测试,但在更新实体数据时遇到了麻烦。更新不起作用,字段值未更新。
简而言之:我创建一个实体并保存数据,然后在另一个请求中我使用 repository.findById(id); 从数据库中获取实体,更改一些字段值,但新值没有持久化在数据库中。我试过调用repository.persist(person);之后但行为相同,数据未更新。
我用 Quarkus 版本 1.9.0.Final、1.9.0.CR1、1.8.3.Final 试过这个
我正在使用 postgreSQL 12。我也尝试使用 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>
应用程序属性:
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 + "']";
    }   
}
休息资源:
@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,旨在将名称更改为“updated updated updated”,但第五个请求显示名称未更新。
虽然不需要,但我试过repository.persist(person); , repository.persistAndFlush(person); , 甚至 repository.getEntityManager().merge(person); (每次一个)如 PersonResource 中所示上面的片段。但它们都没有生效。
我错过了什么?
PS.:我试图将我的实体更改为扩展 PanacheEntity并使用了Person.findById(id);找到实体,这样后续的更新确实生效了。但这不是我的意思,我想使用 PanacheRepository 并想了解我缺少什么。

最佳答案

请考虑使用 getter/setter 访问您的实体,以便 Hibernate 代理能够正常工作。

@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;
    }

关于java - 使用 Quarkus 和 PanacheRepository 更新实体数据不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64503946/

相关文章:

java - 如果我的对象是可序列化的,我可以发送对象的 ArrayList<> 吗?

java - 如何修复此递归 StackOverFlowException 错误?

java - 使用 Hibernate 保存大量记录时内存不足?

java - 为什么 load() 的工作方式与 Hibernate 中的 get() 相同?

testing - QuarkusTest 在注入(inject)期间给出 `could not resolve the bean of type`

java - 在servlet内读取excel文件(多部分数据)

java - 谷歌地图中心 map 由两个位置绑定(bind)并带有一些填充

java - 使用 Hibernate 在插入前检查重复值

multithreading - 使用 Quarkus 启动工作线程的正确方法?

cxf - 是否可以通过 native 编译将 Apache CXF 与 Quarkus 一起使用?