Я подозреваю, что проблема в том, что вы используете конкретный HashSet
вместо Set
интерфейса.Попробуйте это (предполагая, что где-то Id
):
@Entity
public class Schedule implements java.io.Serializable {
private String scheduleName;
private Set<Step> steps = new HashSet<Step>();
@OneToMany(mappedBy="schedule", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
public Set<Step> getSteps() {
return steps;
}
// other properties, getters, setters
}
Также обратите внимание, как я инициализировал свойство steps.Позвольте мне процитировать документацию об этом:
...
Обратите внимание, как переменная экземпляра была инициализирована с экземпляром HashSet.Это лучший способ инициализировать коллекционные свойства вновь созданных (непостоянных) экземпляров.Когда вы делаете экземпляр постоянным, например, вызывая persist (), Hibernate фактически заменит HashSet на экземпляр собственной реализации Set в Hibernate.
И убедитесь, что:
- обе сущности имеют свойство
@Id
(отображаемой части недостаточно для подтверждения). Step
правильно реализует equals
/ hashCode
(см. Ссылкиниже).
Ссылки
- Справочное руководство по Hibernate Core
Обновление: Невозможно воспроизвести (у меня не установлен PostgreSQL, у меня нет думаю это так актуально).Я использовал следующие объекты:
@Entity
public class Step implements java.io.Serializable {
private Long id;
private String duration;
private String stepType;
private Schedule schedule;
@ManyToOne(fetch = FetchType.LAZY)
public Schedule getSchedule() { return schedule; }
@Id @GeneratedValue
public Long getId() { return id; }
// getters, setters, equals, hashCode
}
И:
@Entity
public class Schedule implements java.io.Serializable {
private Long id;
private String scheduleName;
private Set<Step> steps = new HashSet<Step>();
@OneToMany(mappedBy = "schedule", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
public Set<Step> getSteps() { return steps; }
@Id @GeneratedValue
public Long getId() { return id; }
// getters, setters
}
Вот сгенерированный DDL:
create table Schedule (
id bigint generated by default as identity (start with 1),
scheduleName varchar(255),
primary key (id)
)
create table Step (
id bigint generated by default as identity (start with 1),
duration varchar(255),
stepType varchar(255),
schedule_id bigint,
primary key (id)
)
alter table Step
add constraint FK277AEC7B775928
foreign key (schedule_id)
references Schedule
Я даже не понимаю, как вы моглииспользуйте HashSet
в своем OneToMany
, Hibernate жаловался (как и следовало ожидать, если честно), когда я пытался:
Caused by: org.hibernate.AnnotationException: Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: com.stackoverflow.q4083744.Schedule.steps