У меня есть две таблицы в базе данных, A и B. Таблица B имеет идентификатор, состоящий из двух полей. Один из них - это внешний ключ для A. Id из A автоматически генерируется при вставке последовательностью.JPA: сохраняющаяся сущность с составным первичным ключом
A:
ID (PK)
(*other fields*)
B:
SOME_FIELD (PK)
A_ID (PK, FK to A)
Я сопоставляются две таблицы в JPA (Hibernate) следующие JPA specification, таким образом:
@Entity
@Table(name = "A")
public class A implements Serializable {
@Id
@SequenceGenerator(name = "A_SEQ", sequenceName = "A_SEQ")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "A_SEQ")
@Column(name = "ID")
private Long id;
(...)
}
@Entity
@Table(name = "B")
public class B implements Serializable {
@EmbeddedId
@AttributeOverride(name = "someField", column = @Column(name = SOME_FIELD))
private BPK pk;
@MapsId("aId")
@ManyToOne
@JoinColumn(name = "A_ID")
private A a;
(...)
}
@Embeddable
public class BPK implements Serializable {
private Long aId;
private String someField;
@Override
public boolean equals(Object o) {
(...)
}
@Override
public boolean hashCode() {
(...)
}
(...)
}
Проблема заключается в том, что, когда я пытаюсь сохранить объект B, призывающую entityManager.persist (б), где ба устанавливается на объект А, который существует уже в базе данных, я получаю исключение:
javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: package.name.A
Я не знаю, почему это происходит. Я пытаюсь сохранить объект класса B, а не A. Является ли класс сущности неправильным? Или, может быть, я не должен использовать упорство здесь?
Вам необходимо реализовать 'Serializable' в вашем классе сущности. – iNan
Я реализую это. Я не копировал часть «реализует», потому что я реализую больше интерфейсов и не хочу включать ненужные части в свой код. Обновлен вопрос с помощью «реализует Serializable». – martaj