javax.persistence.EntityExistsException: другой объект с тем же значением идентификатора - PullRequest
0 голосов
/ 07 мая 2020

Раньше я не получал никаких ошибок, но внезапно я начал получать ошибку:

javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [baag.betl.dbimporter.esmatrans.db.EquSecurityReferenceData#baag.db.SECU@59c70ceb]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:116) ~[hibernate-core-5.2.10.Final.jar:5.2.10.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) ~[hibernate-core-5.2.10.Final.jar:5.2.10.Final]
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162) ~[hibernate-core-5.2.10.Final.jar:5.2.10.Final]
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:787) ~[hibernate-core-5.2.10.Final.jar:5.2.10.Final]
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:765) ~[hibernate-core-5.2.10.Final.jar:5.2.10.Final]

Нет последовательности, созданной для любого столбца в таблице базы данных oracle. Также есть комбинация уникального ключевого столбца для esn и techid. Я не хочу создавать новый столбец последовательности в моей таблице базы данных.

Я думаю, что не могу использовать @GeneratedValue и установить его в Auto для уникальных столбцов, иначе я получу ошибку последовательности гибернации.

Я также делает clear и flu sh после каждых 1000 обработанных записей.

if (secuData != null) {
                sessionFactory.getCurrentSession().persist(secuData);
}

i++;
    if (i % 1000 == 0) {
                sessionFactory.getCurrentSession().flush();
                sessionFactory.getCurrentSession().clear();
    }

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Чтобы иметь составной первичный ключ, вы можете использовать подход с ключом @IdClass или @Embeddable.

Чтобы продолжить подход @IdClass, вам необходимо следовать некоторым правилам,

  • Составной класс первичного ключа должен быть publi c
  • Он должен иметь конструктор без аргументов
  • Он должен определять методы equals () и hashCode ()
  • Он должен быть Serializable

Итак, в вашем случае класс будет выглядеть так:

@Entity
@Table( name = "SECU" )
@IdClass( SECU.class )
public class SECU implements Serializable
{

    @Id
    @Column(name = "columnName") // use the correct column name if it varies from the variable name provided
    protected String esn;

    @Id
    @Column(name = "columnName") // use the correct column name if it varies from the variable name provided
    protected BigDecimal techrcrdid;

    @Column(name = "columnName") // use the correct column name if it varies from the variable name provided
    protected BigDecimal preTradLrgInScaleThrshld;

    @Column(name = "columnName") // use the correct column name if it varies from the variable name provided
    @Temporal( TemporalType.TIMESTAMP)
    protected LocalDateTime CreDt;

    @Column(name = "columnName") // use the correct column name if it varies from the variable name provided
    protected String fullnm;

    @Override
    public boolean equals( Object o )
    {
        if( this == o ) return true;
        if( !( o instanceof SECU ) ) return false;
        SECU secu = ( SECU ) o;
        return Objects.equals( esn, secu.esn ) &&
                       Objects.equals( techrcrdid, secu.techrcrdid ) &&
                       Objects.equals( preTradLrgInScaleThrshld, secu.preTradLrgInScaleThrshld ) &&
                       Objects.equals( CreDt, secu.CreDt ) &&
                       Objects.equals( fullnm, secu.fullnm );
    }

    @Override
    public int hashCode()
    {
        return Objects.hash( esn, techrcrdid, preTradLrgInScaleThrshld, CreDt, fullnm );
    }

    // getters and setters 
}

Также дважды проверьте свои геттеры и сеттеры в каждом классе сущности, один раз, указанный в вашем вопросе, кажется неправильным.

1 голос
/ 07 мая 2020

Кажется, что ваш класс сущности моделирует составной первичный ключ, но я вижу только 2 @Id и не использую @IdClass аннотацию, которая необходима.

...