2017-02-01 9 views
0

Java8、Hibernate 5.2.1.Final、JPA2、Spring 4.3.1.RELEASEおよびMySQLを使用しています。Hibernate:キー 'PRIMARY'の重複エントリ '173-604'

私は状況に応じて、selectを連続して実行しますが、ConstraintViolationExceptionになります。

まず、以下の表があります。私はMySQLのワークベンチを通じて選択をすれば、それはデータの行を持っています

SELECT * FROM www.person; 

結果

ID,    UID,     JOINING_DATE, LASTACCESS_DATE, DISPLAY_NAME, EMAIL_ADDRESS, AVATAR, PROVIDER 
'176', 'PHblCtu5odMNQEaOu9TOmGgpsJM2', '1485981515384', '1485981525475', 'One',  '[email protected]', null,  '1' 

その後、私のコードは次のようにあります。

のJava

@Override 
public Person findByUid(String uid, Integer provider) { 
    StringBuilder sb = new StringBuilder(); 
    sb.append(" select e.* "); 
    sb.append(" from "); 
    sb.append(" www.person as e "); 
    sb.append(" where e.uid = :uid "); 
    sb.append(" and e.provider = :provider "); 
    Query q = entityManager.createNativeQuery(sb.toString(), Person.class); 
    q.setParameter("uid", uid); 
    q.setParameter("provider", provider); 
    Person person = (Person) q.getResultList().stream().findFirst().orElse(new Person()); 
    return person; 
} 

wher e uid(PHblCtu5odMNQEaOu9TOmGgpsJM2)とプロバイダ(1)は上記の行と一致します。

しかし、上記q.getResultList()が呼び出されたときに、私が取得:

エラー

22:28:25,843 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-14) SQL Error: 1062, SQLState: 23000 
22:28:25,844 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-14) Duplicate entry '173-604' for key 'PRIMARY' 
22:28:25,845 INFO [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (default task-14) HHH000010: On release of batch it still contained JDBC statements 
org.hibernate.exception.ConstraintViolationException: could not execute statement 

@Entity 
@Table(name = "person") 
@XmlRootElement(name = "person") 
public class Person extends AbstractDomain<Long> { 

    // private static final Logger logger = Logger.getLogger(
    // ClassName.class.getName()); 

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

    @Size(min = 1, max = 45) 
    @Column(name = "UID") 
    private String uid; 

    @Column(name = "JOINING_DATE", nullable = false) 
    private Long joiningDate; 

    @Column(name = "LASTACCESS_DATE", nullable = false) 
    private Long lastAccessDate; 

    @Size(min = 1, max = 85) 
    @Column(name = "DISPLAY_NAME", nullable = false) 
    private String displayName; 

    @Size(min = 5, max = 55) 
    @Column(name = "EMAIL_ADDRESS", nullable = false, unique = true) 
    private String emailAddress; 

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "person_language", joinColumns = { 
      @JoinColumn(name = "PER_ID", referencedColumnName = "ID") }, inverseJoinColumns = { 
        @JoinColumn(name = "LANG_ID", referencedColumnName = "LANGUAGE_CODE", unique = true) }) 
    private Set<Language> languages; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) 
    @JoinTable(name = "person_location", joinColumns = { 
      @JoinColumn(name = "PER_ID", referencedColumnName = "ID") }, inverseJoinColumns = { 
        @JoinColumn(name = "LOC_ID", referencedColumnName = "ID", unique = true) }) 
    private Set<LocationPerson> locations = null; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinTable(name = "person_job_favourites", joinColumns = { 
      @JoinColumn(name = "PER_ID", referencedColumnName = "ID") }, inverseJoinColumns = { 
        @JoinColumn(name = "JOB_ID", referencedColumnName = "ID", unique = true) }) 
    private Set<Job> favouriteJobs; 

質問

0を

ConstraintViolationExceptionselectというクエリを実行させることができるかどうかわかりませんでした。どのように私がこの問題を解決するかもしれないかを誰かがアドバイスできるなら、私はそれを感謝します。

p.s.上記のBeanでmergeを正常に実行できます。私はマージ方法で結合列のそれぞれを設定するために必要な

:解決策を見つけた

+0

あなたは、そのトランザクション内の他の操作を実行しますか? –

+0

また、特定の人物IDに対応するperson_language、person_location、person_job_favoritesテーブルの行を追加できます。 –

+0

はい、私は 'select'の直前の同じトランザクションで同じオブジェクト(' person')の 'merge'を行います。コードは 'merge'ではなく' select'でもエラーになります。 – Richard

答えて

0

  person.setLanguages(foundPerson.getLanguages()); 
      person.setLocations(foundPerson.getLocations()); 
      person.setFavoriuteJobs(foundPerson.getFavoriuteJobs()); 
関連する問題