Я пытаюсь отобразить отношение таблицы «один ко многим», описанное на следующей диаграмме в JPA:
Как видно, в таблице "activity_property"
используется составной первичный ключ, в котором (id,name)
и столбец "id"
являются внешним ключом для столбца "id"
в таблице "activity"
.
Мои текущие объекты отображаются таким образом (некоторые вспомогательные методы для ясности опущены):
Activity.java
@Entity
@Getter
@Setter
public class Activity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "act_id_generator")
@SequenceGenerator(name = "act_id_generator", sequenceName = "activity_id_seq", allocationSize = 1, initialValue = 1)
private Integer id;
private String name;
@OneToMany(mappedBy = "id.activityId", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ActivityProperty> properties;
}
ActivityProperty.java
@Entity
@Getter
@Setter
@Table(name = "activity_property")
public class ActivityProperty {
@EmbeddedId
private ActivityPropertyId id;
private String value;
@Enumerated(EnumType.STRING)
private PropertyType type;
}
ActivityPropertyId.java
@Embeddable
@Getter
@Setter
@ToString
public class ActivityPropertyId implements Serializable {
@Column(name = "id")
private Integer activityId;
private String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ActivityPropertyId that = (ActivityPropertyId) o;
return activityId.equals(that.activityId) &&
name.equals(that.name);
}
@Override
public int hashCode() {
return Objects.hash(activityId, name);
}
}
Когда я пытаюсь сохранить активность таким образом:
Activity activity = createActivity("Activity_1");
activity.addProperty(ActivityProperty.from("Prop1", "value1", PropertyType.PARAMETER));
activityDAO.persist(activity);
Я вижу следующие следы в Hibernate:
Hibernate: call next value for activity_id_seq
Hibernate: insert into activity (name, id) values (?, ?)
Hibernate: insert into activity_property (type, value, id, name) values (?, ?, ?, ?)
05-05-2019 12:26:29.623 [main] WARN o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions - SQL Error: 23502, SQLState: 23502
05-05-2019 12:26:29.624 [main] ERROR o.h.e.jdbc.spi.SqlExceptionHelper.logExceptions - NULL not allowed for column "ID"; SQL statement:
insert into activity_property (type, value, id, name) values (?, ?, ?, ?) [23502-199]
Кажется, автоматически сгенерированный идентификатор для Activity
не использовался во второй вставке для ActivityProperty
.
Я не могу понять, как правильно сопоставить такого рода отношения. Чего-то не хватает в моих аннотациях JPA?