【问题标题】:Quarkus/Hiberante relationship between 2 tables两个表之间的 Quarkus/Hiberante 关系
【发布时间】:2020-09-14 14:17:06
【问题描述】:

我尝试使用数据库创建一个简单的 Web 应用程序。我的数据库只有 2 列:

CREATE TABLE IF NOT EXISTS `Board` (
  `BoardID` Integer NOT NULL AUTO_INCREMENT,
  `Title` Varchar(255),
  `Position` Integer NOT NULL,
  PRIMARY KEY (`BoardID`)
);

CREATE TABLE IF NOT EXISTS `Task` (
  `TaskID` Integer NOT NULL AUTO_INCREMENT,
  `BoardID` Integer NOT NULL,
  `Title` Varchar(255),
  `Description` Varchar (1000),
  PRIMARY KEY (`TaskID`),
  FOREIGN KEY (`BoardID`)
  REFERENCES Board(`BoardID`)
);

型号:

@Entity
public class Task extends PanacheEntity {

    @Column(name = "TaskID")
    private Long taskId;

    @ManyToOne (fetch = FetchType.LAZY)
    @JoinColumn(name = "BoardID")
    private Board board;
...
}
@Entity
public class Board extends PanacheEntity{

    @Column(name = "BoardID")
    private Long boardId;

    @OneToMany(mappedBy = "board", orphanRemoval = true)
    private Set<Task> task;
...
}

我的 REST 方法

@Path("/hello")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class ExampleResource {

    @Inject
    BoardRepository boardRepository;

    @GET
    @Transactional
    public List<Board> getAll() {
        return boardRepository.listAll();
    }
}

我的代码正在编译,但是当我调用我的 REST 方法时,我收到错误: enter image description here

请帮助我做错了什么

【问题讨论】:

  • 您的 PanacheEntity 中有什么?
  • 您使用哪个数据库?您的 pojo 是否也用 @Entity 注释
  • 我使用 MySQL。是的,我在 pojo 类中使用了带注释的 @Entity。
  • @TomStroemer 如果我很好理解 PanacheEntity 允许使用像 CRUD 这样的存储库

标签: java hibernate quarkus quarkus-panache


【解决方案1】:

查看PanacheEntity的代码。来自 JavaDoc:

表示具有生成的 ID 字段 {@link #id} 类型为 {@link Long} 的实体。如果您的 Hibernate 实体扩展了此类,它们将获得 ID 字段和对其所有公共字段的自动生成的访问器(除非使用 {@link Transient} 注释),以及来自 {@link PanacheEntityBase} 的所有有用方法。

如果您想要自定义 ID 类型或策略,可以直接扩展 {@link PanacheEntityBase},并编写自己的 ID 字段。你仍然会得到自动生成的访问器和 所有有用的方法。

从这里复制的JavaDoc:https://github.com/quarkusio/quarkus/blob/master/extensions/panache/hibernate-orm-panache/runtime/src/main/java/io/quarkus/hibernate/orm/panache/PanacheEntity.java

您的 id 列没有名称“id”。所以你应该改用PanacheEntityBase,你必须改变你的实体并将@Id注释添加到你的id字段:

@Entity
public class Task extends PanacheEntityBase {

    @Id
    @Column(name = "TaskID")
    private Long taskId;

    @ManyToOne (fetch = FetchType.LAZY)
    @JoinColumn(name = "BoardID")
    private Board board;
...
}
@Entity
public class Board extends PanacheEntityBase {

    @Id
    @Column(name = "BoardID")
    private Long boardId;

    @OneToMany(mappedBy = "board", orphanRemoval = true)
    private Set<Task> task;
...
}

如果您想使用 PanacheEntity 作为您的基类,您必须更改数据库中的列名并从您的实体中删除 taskId 和 boardId。

【讨论】:

  • 您好,您能帮我进行延迟初始化吗?当我尝试使用我的 Rest 方法 getAll() 时,我收到错误 imgur.com/a/04YzGIA
  • 请创建一个新问题。将完整的堆栈跟踪添加为文本而不是图像。还请分享您调用该方法的代码以及实体的相关部分。
猜你喜欢
  • 1970-01-01
  • 2016-06-27
  • 2017-07-31
  • 1970-01-01
  • 2018-09-03
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多