У меня есть объект JPA/Hibernate, который использует составной ключ в качестве первичного ключа. Когда я читаю объект из базы данных и делаю обновление, я получаю сообщение об ошибке
javax.persistence.PersistenceException: org.hibernate.HibernateException: identifier of an instance of navigation.external.CustomerNavigationType was altered from navigation.external.CustomerNavigationTypeId@7ccdbbc5 to navigation.external.CustomerNavigationTypeId@bba8c505
Ошибка возникает при сбросе.
Я прочитал несколько других сообщений coderhelper и попытался реализовать предложения, но все еще получаю сообщение об ошибке. Вы видите, что мне не хватает?
Объект:
@NoArgsConstructor
@Getter
@Setter
@Entity(name = "CustomerNavigationType")
@IdClass(CustomerNavigationTypeId.class)
@Table(name = "MY_TABLE")
public class CustomerNavigationType {
@Id
@Column(name = "BANKNR")
private BigDecimal bankNr;
@Id
@Column(name = "NAVTYPE")
private String navType;
@Id
@Column(name = "JUREN")
private String juren;
@Column(name = "STATU")
private String state;
}
CompositeKey:
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class CustomerNavigationTypeId implements Serializable {
private BigDecimal bankNr;
private String navType;
private String juren;
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
CustomerNavigationTypeId other = (CustomerNavigationTypeId) obj;
return Objects.equals(bankNr, other.getBankNr())
&& Objects.equals(navType, other.getNavType())
&& Objects.equals(juren, other.juren());
}
@Override
public int hashCode() {
return Objects.hash(bankNr, navType, juren);
}
}
Код клиента базы данных:
EntityManager em = entityManagerProducer.getEntityManager();
CustomerNavigationTypeId compositeId = new CustomerNavigationTypeId(
BigDecimal.valueOf(1),
"NAVRULE1",
"2021-08-05 22:15:00.384395");
em.getTransaction().begin();
CustomerNavigationType customerNavigationType = em.find(CustomerNavigationType.class, compositeId);
customerNavigationType.setState("ACTIVE");
em.flush();
em.getTransaction().commit();
Я не совсем понимаю, что происходит. Но почему вы используете BigDecimal для номера банка?