Java Hibernate:键“PRIMARY”的重复条目“173-604”

Java Hibernate:键“PRIMARY”的重复条目“173-604”,java,mysql,hibernate,jpa,Java,Mysql,Hibernate,Jpa,我正在使用Java8、Hibernate5.2.1.Final、JPA2、Spring4.3.1.RELEASE和MySQL 我有一种情况,我对一行进行选择,但得到一个ConstraintViolationException 首先,我有下表。如果我通过MySQL Workbench进行选择,它有一行数据: SELECT * FROM www.person; 结果 然后,我的代码包含以下内容: 爪哇 其中uid PHblCtu5odMNQEaOu9TOmGgpsJM2和提供程序1与上面的行匹配

我正在使用Java8、Hibernate5.2.1.Final、JPA2、Spring4.3.1.RELEASE和MySQL

我有一种情况,我对一行进行选择,但得到一个ConstraintViolationException

首先,我有下表。如果我通过MySQL Workbench进行选择,它有一行数据:

SELECT * FROM www.person;
结果

然后,我的代码包含以下内容:

爪哇

其中uid PHblCtu5odMNQEaOu9TOmGgpsJM2和提供程序1与上面的行匹配

但是当调用上面的q.getResultList时,我得到:

错误

豆子

问题:

我不知道执行select查询会得到ConstraintViolationException。如果有人能建议我如何解决这个问题,我将不胜感激

p、 我可以在上面的Bean上成功地进行合并。

找到了一个解决方案:

我需要在merge方法中设置每个连接的列:

            person.setLanguages(foundPerson.getLanguages());
            person.setLocations(foundPerson.getLocations());
            person.setFavoriuteJobs(foundPerson.getFavoriuteJobs());

您是否在该事务中执行任何其他操作?此外,可以添加表person\u language、person\u location、person\u job\u favorites的行,这些行对应于特定的person id,我在选择之前在同一事务中合并同一对象person。代码不会在合并中出错,而是在选择中出错;然后合并并选择。让我们看看我必须在合并之前添加它吗?
@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;
}
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;
            person.setLanguages(foundPerson.getLanguages());
            person.setLocations(foundPerson.getLocations());
            person.setFavoriuteJobs(foundPerson.getFavoriuteJobs());