Отношение Quarkus / Hiberante между 2 таблицами - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь создать простое веб-приложение с базой данных. В моей базе данных всего 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, я получаю ошибку: введите описание изображения здесь

Помогите, пожалуйста, что я делаю неправильно

1 Ответ

1 голос
/ 28 мая 2020

Проверьте код PanacheEntity. Из JavaDo c:

Представляет объект со сгенерированным полем идентификатора {@link #id} типа {@link Long}. Если ваши объекты Hibernate расширяют этот класс, они получают поле идентификатора и автоматически сгенерированные средства доступа ко всем своим полям publi c (если они не аннотированы с помощью {@link Transient}), а также все полезные методы из {@link PanacheEntityBase}.

Если вам нужен собственный тип идентификатора или стратегия, вы можете напрямую расширить {@link PanacheEntityBase} и написать собственное поле идентификатора. Вы по-прежнему будете получать автоматически сгенерированные средства доступа и все полезные методы.

JavaDo c скопировано отсюда: 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 в поля идентификатора:

@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 в качестве основы class, вам необходимо изменить имена столбцов в базе данных и удалить taskId и boardId из ваших сущностей.

...