Проблема с аннотацией JPA Hibernate

У меня есть три объекта, которые я моделирую, и у меня проблемы с соответствующими аннотациями. В основном у меня есть класс, который я намереваюсь вернуть вызывающей стороне, вложенный список проектов, а проект может содержать вложенный список конечных точек. Это верхний уровень имеет один ко многим, тогда вложенный один ко многим имеет два один ко многим.

Я играл с аннотациями @JoinColumn, я пытался поставить @ManyToOne с другой стороны OneToMany (но мне не нравится, что это Long ..). Я просто довольно новичок и не знаю, как это сделать. Я думаю, что mappedById - это решение, но я не уверен.

Основная проблема: этот код позволяет мне «сохранять» в базе данных, но после извлечения список проектов внутри пакета DownDetectorPackage пуст.

CascadeType.ALL выдает ошибки ссылочной целостности, которые я не совсем понимаю.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Builder                                                                               
public class DownDetectorPackage {

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

@OneToMany(mappedBy = "id",fetch = FetchType.EAGER)
private List<Project> projects;

@Temporal(TemporalType.DATE)
private Date dateJobsLastRan;

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Project{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String projectName;
    @OneToMany(mappedBy = "id")
    private List<Service> externalDependencies;
    @OneToMany(mappedBy = "id")
    private List<Service> endpoints;
}

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Service {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String url;
    private Boolean endpointIsUp;
    private String serviceName;
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны пометить каждый столбец соединения как JoinColumn, обозначающий ссылочный столбец из другого объекта. Затем вы должны сказать, какой тип отношения использует этот столбец.

public class Project {

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

    private String projectName;

    @JoinColumn(referencedColumnName = "id")
    @OneToMany(fetch = FetchType.LAZY)
    private ExternalDependencyEntity externalDependencies;

    @JoinColumn(referencedColumnName = "id")
    @OneToMany(fetch = FetchType.LAZY)
    private EndpointEntity endpoints;
}

Наконец, обратите внимание, что в реляционной базе данных каждый столбец fk может принимать только 1 значение (pk идентификатора ссылочной сущности), поэтому в вашей сущности вы должны пометить тип данных как сущность, на которую вы ссылаетесь, а не как коллекцию.

Я думаю, что это решит вашу проблему.

Мне нужно сделать что-то транзакционное или что-то в этом роде? При сохранении я вижу следующую ошибку с этой настройкой: HHH000010: при выпуске пакета он все еще содержал операторы JDBC: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: com. usaa.pc.property.downdetector.model.Project

Anticrombie23 10.12.2020 17:41

Мне нужно было CascadeType.ALL для всех коллекций, но это сработало.

Anticrombie23 10.12.2020 17:50

оба ответа были правильными, он просто помог, проследив :(

Anticrombie23 10.12.2020 17:54
Ответ принят как подходящий

Вы должны использовать @JoinColumn вместо mappedBy. MappedBy можно использовать, когда вы использовали @ManyToOne и в другом классе, которого у вас нет.

Итак, ваш окончательный класс должен выглядеть примерно так (это применимо и к другим классам, которые вы упомянули):

public class DownDetectorPackage {

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

@JoinColumn(name = "downDetectorPackageId")
@OneToMany(fetch = FetchType.EAGER)
private List<Project> projects;

@Temporal(TemporalType.DATE)
private Date dateJobsLastRan;

Кроме того, не забудьте указать имя родительского объекта в аннотации @JoinColumn, так как это создаст столбец для этого внешнего ключа.

Мне нужно сделать что-то транзакционное или что-то в этом роде? При сохранении я вижу следующую ошибку с этой настройкой: HHH000010: при выпуске пакета он все еще содержал операторы JDBC: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: com. usaa.pc.property.downdetector.model.Project

Anticrombie23 10.12.2020 17:42

Если вы столкнулись с такой ошибкой, проверьте, не передаете ли вы уже «ID» для вновь созданного объекта, т. е. проекта. Он должен быть нулевым для новой записи.

Mubaraka Bharucha 10.12.2020 17:46

Мне нужно было CascadeType.ALL для всех коллекций, но это сработало.

Anticrombie23 10.12.2020 17:50

Другие вопросы по теме