catch MySQLIntegrityConstraintViolationException

时间:2012-07-30 00:48:03

标签: java mysql jpa persistence jpql

我遇到了违规行为:

run:
DEBUG: nntp: newsrc loading /home/thufir/.newsrc
DEBUG: nntp: newsrc load: 6 groups in 20ms
[EL Info]: 2012-07-29 07:07:55.308--ServerSession(11070985)--EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
[EL Info]: 2012-07-29 07:07:57.621--ServerSession(11070985)--file:/home/thufir/NetBeansProjects/USENET/build/classes/_USENETPU login successful
[EL Warning]: 2012-07-29 07:07:58.0--UnitOfWork(1697152)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'gwene.ca.craigslist.vancouver.labour.general' for key 'NEWSGROUP'
Exception in thread "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'gwene.ca.craigslist.vancouver.labour.general' for key 'NEWSGROUP'
Error Code: 1062
Call: INSERT INTO NEWSGROUPS (NEWSGROUP) VALUES (?)
    bind => [1 parameter bound]
Query: InsertObjectQuery(net.bounceme.dur.usenet.model.Newsgroups[ id=null ])
Error Code: 1062
Call: INSERT INTO NEWSGROUPS (NEWSGROUP) VALUES (?)
    bind => [1 parameter bound]
Query: InsertObjectQuery(net.bounceme.dur.usenet.model.Newsgroups[ id=null ])
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commitInternal(EntityTransactionImpl.java:102)
    at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:63)
    at net.bounceme.dur.usenet.driver.NewMain.folders(NewMain.java:41)
    at net.bounceme.dur.usenet.driver.NewMain.<init>(NewMain.java:26)
    at net.bounceme.dur.usenet.driver.NewMain.main(NewMain.java:22)
Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'gwene.ca.craigslist.vancouver.labour.general' for key 'NEWSGROUP'
Error Code: 1062
Call: INSERT INTO NEWSGROUPS (NEWSGROUP) VALUES (?)
    bind => [1 parameter bound]
Query: InsertObjectQuery(net.bounceme.dur.usenet.model.Newsgroups[ id=null ])
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:324)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeDirectNoSelect(DatabaseAccessor.java:840)
    at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeNoSelect(DatabaseAccessor.java:906)

我尝试将persist包装起来以捕获MySQLIntegrityConstraintViolationException:

private void folders() {
    List<Folder> folders = u.getFolders();
    emf = Persistence.createEntityManagerFactory("USENETPU");
    em = emf.createEntityManager();
    for (Folder folder : folders) {
        Newsgroups n = new Newsgroups(folder);
        em.getTransaction().begin();
        try {
            em.persist(n);
        } catch (Exception e) {
            LOG.info("duplicate");
        }
        em.getTransaction().commit();
    }
    em.close();
}

我该如何处理此异常?

实体:

package net.bounceme.dur.usenet.model;

import java.io.Serializable;
import javax.mail.Folder;
import javax.persistence.*;

@Entity
@NamedQueries({
    @NamedQuery(name = "Newsgroups.findAll", query = "SELECT n FROM Newsgroups n"),
    @NamedQuery(name = "Newsgroups.findById", query = "SELECT n FROM Newsgroups n WHERE n.id = :id")})
public class Newsgroups implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;
    //@Column
    @Column(unique = true)
    private String newsgroup;

    public Newsgroups() {
    }

    public Newsgroups(Folder folder) {
        newsgroup = folder.getFullName();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Newsgroups)) {
            return false;
        }
        Newsgroups other = (Newsgroups) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "net.bounceme.dur.usenet.model.Newsgroups[ id=" + id + " ]";
    }
}

0 个答案:

没有答案