Отношение Quarkus/Hiberante между 2 таблицами
Я пытаюсь создать простое веб-приложение с базой данных. В моей базе данных всего 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 ответ
Проверьте код PanacheEntity
. Из JavaDoc:
Представляет объект со сгенерированным полем идентификатора {@link #id} типа {@link Long}. Если ваши объекты Hibernate расширяют этот класс, они получают поле ID и автоматически сгенерированные средства доступа ко всем своим общедоступным полям (если они не аннотированы с помощью {@link Transient}), а также все полезные методы из {@link PanacheEntityBase}.
Если вам нужен собственный тип идентификатора или стратегия, вы можете напрямую расширить {@link PanacheEntityBase} и написать собственное поле идентификатора. Вы по-прежнему будете получать автоматически сгенерированные средства доступа и все полезные методы.
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. Итак, вы должны использовать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
в качестве базового класса вы должны изменить имена столбцов в базе данных и удалить taskId и boardId из ваших сущностей.