【问题标题】:How to solve Hibernate "ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry " Exception如何解决 Hibernate “ERROR o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry”异常
【发布时间】:2017-09-05 16:50:46
【问题描述】:

我已经测试了 2 天来解决这个问题,但没有任何效果。 我在双向关系中暗示了这些实体。

@Entity
@Table( name = "T_user" )
public class T_user implements Serializable {
   @Id
   @GeneratedValue( strategy = GenerationType.IDENTITY )
   private Long               id_user;

   @OneToOne( targetEntity = T_infosProfile.class, mappedBy = "user", fetch = FetchType.LAZY, orphanRemoval = true )
   private T_infosProfile     infosProfile;

   public void setInfosProfile( T_infosProfile infosProfile ) {
    this.infosProfile = infosProfile;
   }
}

@Entity
@Table( name = "T_infosProfile" )
public class T_infosProfile {

   @Id
   @GeneratedValue( strategy = GenerationType.IDENTITY )
   private Long       id_infos;

   @OneToOne( targetEntity = T_user.class, fetch = FetchType.LAZY )
   @JoinColumn( name = "id_user", unique = true, nullable = false )
   private T_user user;

     @Column( name = "pourcentage_completion", length = 3, updatable = true, unique = false )
     private Integer    pourcentageCompletion;

     @Column( name = "infos_identite", nullable = false, updatable = true, length = 1, columnDefinition = "TINYINT(1)" )
     private Boolean    infosIdentiteCompleted;

     @Column( name = "infos_coordonnees", nullable = false, updatable = true, length = 1, columnDefinition = "TINYINT(1)" )
     private Boolean    infosCoordonneesCompleted;

     @Column( name = "infos_bancaires", nullable = false, updatable = true, length = 1, columnDefinition = "TINYINT(1)" )
     private Boolean    infosBancaireCompleted;

     @Column( name = "infos_chicowa", nullable = false, updatable = true, length = 1, columnDefinition = "TINYINT(1)" )
     private Boolean    infosCompleted;

   //the setter method
   public void setUser( T_user user) {
      this.user = user;
      this.infosIdentiteCompleted = true;
      this.pourcentageCompletion = 0;
      this.infosCoordonneesCompleted = this.user.getInfosCoordonnees() == null ? false : true;
      this.infosBancaireCompleted = this.user.getInfosBancaire() == null ? false : true;
      this.infosCompleted = this.user.getInfosCompleted() == null ? false : true;

      if ( this.infosCoordonneesCompleted == true ) {
        this.pourcentageCompletion = 50;
    }
      if ( this.infosBancaireCompleted == true && this.pourcentageCompletion == 50 ) {
        this.pourcentageCompletion = 75;
    }
      if ( this.infosChicowaCompleted == true && this.pourcentageCompletion == 75 ) {
        this.pourcentageCompletion = 100;
    }
  }
}

我也有这个方法用来更新用户的 infosProfile :

@Service
public class UIServiceImpl implements UIService {

  @Autowired
  private TinfosProfileRepository   infosProfileRepository;

  @Override
  public T_infosProfile saveInfosPorfile( T_user connectedUser ){
    T_infosProfile infosProfile = connectedUser.getInfosProfile();
    infosProfile.setUser( connectedUser );
    connectedUser.setInfosProfile( infosProfile );
    try {
        return infosProfileRepository.save( infosProfile );
    } catch ( Exception e ) {
        throw new ExceptionsDAO( e.getMessage() );
    }
}

但是当我调用此方法时,它适用于一种情况,但对于另一种情况,我得到了这个异常:

10-04-2017 16:27:43 [http-nio-8080-exec-3] WARN  o.h.e.jdbc.spi.SqlExceptionHelper - SQL Error: 1062, SQLState: 23000
10-04-2017 16:27:43 [http-nio-8080-exec-3] ERROR  o.h.e.jdbc.spi.SqlExceptionHelper - Duplicate entry '8' for key 'UK_bkariaocmnn2rlh477hvoqkyf'

我只想更新当前用户的 infosProfile 属性。 它工作正常的情况是只更新了一个 infosProfile 的属性,但是当我同时更新 2 个属性并尝试 saveInfosProfile() 时,会引发异常。

请帮忙。

【问题讨论】:

    标签: mysql jdbc spring-data-jpa hibernate-mapping sqlexception


    【解决方案1】:

    查看错误消息,它是不言自明的,因为它表示值 8 已经存在于该列中。由于您在该特定列上定义了UNIQUE CONSTRAINT,因此引发了该错误

    Duplicate entry '8' for key 'UK_bkariaocmnn2rlh477hvoqkyf'
    

    附加:查看您的约束名称UK_bkariaocmnn2rlh477hvoqkyf。如果您在创建约束时没有命名约束,就会发生这种情况。

    【讨论】:

    • 我知道,但正如你所见,我只是保存现有实体,我没有创建新实例,所以我不知道为什么会引发此异常。
    • 你的意思是:“当你在创建约束时没有命名约束时会发生这种情况。”
    • @akuma8,你得到一个系统生成的不可读的约束名称。
    • 如何更改?我自己从来没有定义过这个约束
    【解决方案2】:

    好吧,在失去 4 天之后,我找到了一个似乎可行的解决方案。这是我的解决方案:

    @Override
    public T_infosProfile saveInfosPorfile( T_user connectedUser ){
      T_infosProfile infosProfile = infosProfileRepository.findByUser(connectedUser); // I had to load by the user before saving it.
      infosProfile.setUser( connectedUser );
      connectedUser.setInfosProfile( infosProfile );
      try {
        return infosProfileRepository.save( infosProfile );
      } catch ( Exception e ) {
        throw new ExceptionsDAO( e.getMessage() );
      }
    }
    

    对我来说,这是一个奇怪的行为,因为用户与保存在表中的用户相同。感谢休眠!

    【讨论】:

      【解决方案3】:

      在我的 spring 项目中与这个问题斗争了一段时间后,我能够使用下面的代码解决我面临的问题。

        infosProfile=null;
      
        try {
      
            infosProfile = infosProfileRepository.save( infosProfile );
        } 
        catch (PersistenceException ex) {
      
              Throwable cause1 = ex.getCause();
      
              if(!isNull(cause1)){
                  throw new UnsupportedOperationException(cause1.getCause().getMessage());
      
              }
              throw new UnsupportedOperationException(ex.getMessage());
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 2021-08-06
        相关资源
        最近更新 更多