当前位置: 首页 > 知识库问答 >
问题:

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

寇景明
2023-03-14

我正在使用Quarkus和PanacheRepository进行一些测试,在更新实体数据时遇到了麻烦。更新不起作用,字段值不会更新。

简而言之:我创建一个实体并持久化数据,然后在另一个请求中,我使用存储库从数据库中获取实体。查找字节id(id),更改一些字段值,但新值不会持久化在数据库中。我尝试调用存储库。坚持(人)after,但行为相同,数据不会更新。

我用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)来编写代码,并在命令行中运行应用程序,使用:< code >。/mvnw编译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请求创建一个带有“一些名字”的人,如第三个请求所示;第四个请求执行一个PUT,旨在将名称更改为“更新更新更新”,但第五个请求显示名称未更新。

虽然不需要,但我尝试了repository.persist(person);repository.persistAndFlush(person);,甚至repository.getEntityManager().merge(person); (每次一个),如上面的PersonResource代码段所示。但他们都没有生效。

我错过了什么?

PS.:我试图更改我的实体以扩展PanacheEntity并使用Person.findById(id)来查找实体,这样后续更新确实生效了。但这不是我的意思,我想使用PanacheRepository,并想了解我缺少什么。

共有1个答案

南宫奇思
2023-03-14

请考虑使用 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;
    }
 类似资料:
  • 问题内容: 我有以下请求处理程序 和以下mongodb反应式存储库 问题在于执行该方法后,对象中没有任何更改。我设法解决了这个问题,但是我不知道为什么在其他存储库中进行的第一个保存有效,而这个无效。为什么要这样做? 问题答案: 除非有人订阅了反应式发布者,否则什么都不会发生。这就是为什么当您使用block()时它开始起作用的原因。如果您需要调用数据库并在另一个数据库请求中使用结果,而不是使用诸如m

  • 我有一个PSU实体: null 我收到错误:

  • 我正在用一些初始数据绘制一个条形图,然后在单击按钮时尝试更新。我收到错误“未捕获的类型错误:无法读取未定义的属性'长度'”。单击更新后,将发生错误。如何解决此问题并启用更新功能以绘制新的条形图? D3代码:

  • 这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na

  • 如果我只传递一个字符串,而不是的列表: 我得到的是:

  • 我正在尝试实现一个日志过滤器来记录对Quarkus应用程序APIendpoint的请求和响应。我正在使用Quarkus 1.13.3。最终和quarkus resteasy反应。在调用非阻塞endpoint时,尝试记录请求主体时遇到问题。这是我用来记录请求的代码: 当我调用具有@Blocking注释的APIendpoint时,这可以正常工作,但当我调用非阻塞API时,会出现以下错误: 有没有办法绕