Я не совсем уверен, почему ваша конфигурация не работает. У меня похожая конфигурация в одном из моих проектов, которая работает просто отлично. Однако мне удалось найти решение, добавив аннотацию @MapsId к ManyToOne в классе Task. (см. Может кто-нибудь объяснить мне @MapsId в hibernate? для объяснения о MapsId) Я также удалил inserttable = false и Updatable = false. Ниже приведен код.
Мне не удалось заставить MapsId работать с классом StoryId, поэтому я изменил тип TaskPKID.storyId с StoryId на long. Класс StoryId, кажется, не добавляет много, так что, надеюсь, это не составляет большой проблемы. Если вы найдете решение, пожалуйста, дайте мне знать в комментариях!
Кстати, у вашего кода много проблем. Существует множество опечаток и сопоставление OneToMany со свойством, которое не является коллекцией (что не разрешено). Это затруднило мне отладку проблемы. Пожалуйста, не забудьте опубликовать код лучшего качества в своих вопросах в следующий раз.
Вот класс Task, как я его реализовал:
@Entity
@Table(name = "TASK_XREF")
class Task {
@EmbeddedId
TaskPKId taskPKId;
@Column(name = "TASK_NAME")
String name;
@MapsId("storyId")
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "STORY_ID")
Story story;
//getters, setters
}
А вот класс TaskPKID:
@Embeddable
class TaskPKId implements Serializable {
long taskId;
long taskTypeId;
@Column(name="STORY_ID")
long storyId;
public long getTaskId() {
return taskId;
}
public void setTaskId(long taskId) {
this.taskId = taskId;
}
public void setTaskTypeId(long taskTypeId) {
this.taskTypeId = taskTypeId;
}
}