Объектно-реляционное сопоставление с помощью инструментов JPA: функция генерации таблиц из сущностей

#java #sql #orm #jpa #jakarta-ee

#java #sql #orm #jpa #джакарта-ee

Вопрос:

У меня возникает проблема, когда я использую функцию JPA «Генерировать таблицы из сущностей» в eclipse. Мне удалось выполнить все мои сопоставления ORM для моего проекта, но есть только одно, которое вызывает у меня проблемы.

В консоли указано следующее:

Внутреннее исключение: java.sql.SQLSyntaxErrorException: ‘OFFER_ID’ не является столбцом в таблице или VTI ‘COMMENT’. Код ошибки: -1

Это изображение того, как должны выглядеть таблицы:

введите описание изображения здесь

-К одному предложению есть много комментариев

-Один комментарий принадлежит одному предложению

Вот как выглядят объекты: комментарий к объекту:

 @Entity
public class Comment {
// Attributes
@Id
@GeneratedValue
@Column(nullable = false)
private Long id;
      ...
@ManyToOne
@JoinColumn(name = "OFFER_ID", nullable = false)
private Offer offer;// One comment must belong to one offer
...Getters and setters
  

Предложение объектов:

 @Entity
public class Offer {
   //...Other attributes

    @OneToMany(mappedBy = "offer")
private List<Coupon> coupons;//One offer can have many coupons

@OneToMany(mappedBy = "offer")
private List<Comment> comments; //One offer can have many comments

    ... getters and setters
  

В класс Offer я специально вставил связь, которую класс offer имеет с другим классом, называемым coupons, как вы видите, она точно такая же, как та, которую должно иметь предложение с классом Comment .

Так в чем проблема?

Почему одно отношение сопоставляется, а другое нет?

Почему в новой созданной таблице в КОММЕНТАРИИ к базе данных нет столбца с именем OFFER_ID?

Как я могу это исправить?

Ответ №1:

Я полагаю, что линия

 @JoinColumn(name = "OFFER_ID", nullable = false)
  

вызывает у вас проблемы. Потому что у вас действительно нет столбца OFFER_ID в таблице предложений.

Чтобы исправить это, добавьте поле идентификатора в свой объект предложения:

 @Id(columnName = "OFFER_ID")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
  

Возможно, я ошибаюсь с синтаксисом…

Ответ №2:

Может быть, вам нужно <property name="hibernate.hbm2ddl.auto" value="update"/> в persistence.xml