Проблема JPA и Hibernate, идентификатор экземпляра x

avatar
CodingCowboy
8 августа 2021 в 21:16
91
1
0

У меня есть объект 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();
Источник
Simon Martinelli
9 августа 2021 в 06:03
0

Я не совсем понимаю, что происходит. Но почему вы используете BigDecimal для номера банка?

Ответы (1)

avatar
CodingCowboy
10 августа 2021 в 12:12
0

Я решил проблему, используя @EmbeddedId и @Embeddable вместо @Idclass и т. д.