当前位置: 首页 > 知识库问答 >
问题:

EntityExistsException:具有相同标识符值的不同对象

楮庆
2023-03-14

以前我没有得到任何错误,但突然我开始得到错误:

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]
if (secuData != null) {
                sessionFactory.getCurrentSession().persist(secuData);
}

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

共有1个答案

钱俊楚
2023-03-14

要拥有复合主键,可以使用@idclass@embeddable键方法。

要继续使用@idclass方法,您需要遵循一些规则,

  • 复合主键类必须是公共的
  • 它必须具有无参数构造函数
  • 它必须定义equals()和hashCode()方法
  • 它必须是可序列化的

所以在你的例子中,这个类看起来像是,

@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 
}

另外,仔细检查每个实体类中的getter和setter,问题中提供的一次似乎不正确。

 类似资料:
  • 此方法以事务开头 这是一个映射器类,我在其中创建DB帐户实体并映射地址和联系人。 当我不在地图内调用下面的方法时,一切都正常工作。但是当我调用它时,我得到了标题中描述的错误。 最后的方法是 异常堆栈跟踪 null

  • 我有以下问题: 有人对此有解释吗?我考虑从我的业务服务中的hibernate会话中重新加载对象,并从Struts HTTP会话中复制实体对象中的数据。 Hibernate映射

  • null 对于我的数据,我有时会遇到这样的问题:A有一组不同的B对象,而这些B对象引用同一个C对象。 当我调用时,我会得到一个hibernate错误:。我知道hibernate不能在同一个会话中插入/更新/删除同一个对象两次,但是有什么方法可以解决这个问题吗?这似乎并不是一种罕见的情况。 在我研究这个问题的过程中,我看到有人建议使用,但当我这样做时,任何“冲突”对象都会作为所有值都设置为null的

  • 我们试图通过Keycloak验证现有用户,因此实现了自定义SPI,并将自定义SPI添加为用户联合 原因:javax.persistence.EntityExistsException:具有相同标识符值的不同对象已与会话关联:[org.keycloak.storage.jpa.entity.FederatedUserRoleMappingEntity#org.keycloak.storage.jpa

  • 问题内容: 在使用Spring和Hibernate的应用程序中,我解析CSV文件,并在每次从CSV文件中读取记录时通过调用来填充db 。 我的域模型: “家庭”有很多“子家庭” “子家庭”有很多“位置” “ Locus”属于“ Species” 都是双向映射。 码: 使用以下方法将物种分配给场所,该方法仅访问DAO层: Hibernate给出以下错误: 有小费吗? 问题答案: 使用。该异常表示当前

  • 我有一个标准的Spring/JPA/Hibernate设置。带有@Transactional的服务方法,它使用两个不同的DAO,每个DAO都注入了自己的EntityManager实例。 当查询时,什么是最终相同的实体(直接和间接检索),它们被表示为不同的对象,即使对于相同的hibernate会话(事务)它们应该是相同的对象。