У меня есть три объекта, которые я моделирую, и у меня проблемы с соответствующими аннотациями. В основном у меня есть класс, который я намереваюсь вернуть вызывающей стороне, вложенный список проектов, а проект может содержать вложенный список конечных точек. Это верхний уровень имеет один ко многим, тогда вложенный один ко многим имеет два один ко многим.
Я играл с аннотациями @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;
}




Вы должны пометить каждый столбец соединения как 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 идентификатора ссылочной сущности), поэтому в вашей сущности вы должны пометить тип данных как сущность, на которую вы ссылаетесь, а не как коллекцию.
Я думаю, что это решит вашу проблему.
Мне нужно было CascadeType.ALL для всех коллекций, но это сработало.
оба ответа были правильными, он просто помог, проследив :(
Вы должны использовать @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
Если вы столкнулись с такой ошибкой, проверьте, не передаете ли вы уже «ID» для вновь созданного объекта, т. е. проекта. Он должен быть нулевым для новой записи.
Мне нужно было CascadeType.ALL для всех коллекций, но это сработало.
Мне нужно сделать что-то транзакционное или что-то в этом роде? При сохранении я вижу следующую ошибку с этой настройкой: HHH000010: при выпуске пакета он все еще содержал операторы JDBC: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: com. usaa.pc.property.downdetector.model.Project