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

Java 使用Quarkus和PanacherRepository更新实体数据不起作用,java,hibernate,quarkus,quarkus-panache,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尝试了这一点 我正在使用p

我正在用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

我使用Eclipse2020-06(4.16.0)只编写代码,并在命令行中运行应用程序,使用:
/mvnw compile quarkus:dev

我创建了一个全新的简单应用程序,其行为与此相同。以下是主要配置和一些代码片段:

pom.xml


3.8.1
真的
11
11
UTF-8
UTF-8
1.9.0.1最终版本
夸克宇宙物质清单
夸克斯
1.9.0.1最终版本
3.0.0-M5
夸克斯
quarkus resteasy jsonb
夸克斯
夸克斯冬眠
夸克斯
quarkus jdbc postgresql
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 + "']";
    }   
}
休息资源:

@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;
    }
}
因此,列表开始为空,第二个POST请求创建了一个名为“some name”的人,如第三个请求所示;第四个请求执行PUT,该PUT旨在将名称更改为“更新”,但第五个请求显示名称未更新

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

我错过了什么


注:我试图将我的实体更改为extends
PanacheEntity
,并使用了
Person.findById(id)
要查找实体,后续更新会以这种方式生效。但这不是我的观点,我想使用PhanaCePiStand并想了解我错过了什么。

< P>请考虑使用GETT/SETTER访问您的实体,因此Hibernate代理将正常工作。
@实体
公共阶层人士{
@Id@GeneratedValue公共长Id;

private String name;//我弄错了。我试图将公共字段与PanacheRepository一起使用,但setter的缺席无法启用跟踪字段更改的hibernate代理,因此更新无法工作。使用Panache可以使用公共字段,但它仅在实体扩展PanacheEntity/PanacheEntityBase时才起作用(在幕后,Panache将提供getter/setter,以便hibernate代理正常工作)。否则(即使在使用PanacheRepository时),实体必须以“hibernate/JPA方式”定义,即使用getter/setter,以便代理正常工作。
@ApplicationScoped
public class PersonRepository implements PanacheRepository<Person> {
}
$ 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"}]