2012-03-14 36 views
1

我有以下表: enter image description here如何從「0」開始UNSIGNED AUTO_INCREMENT字段?

enter image description here

其中idclientunsignedauto_increment

代碼客戶端實體:

import java.io.Serializable; 

import java.util.List; 

import javax.persistence.*; 

import javax.xml.bind.annotation.XmlRootElement; 

import javax.xml.bind.annotation.XmlTransient; 


@Entity 
@Table(name = "CLIENT", catalog = "TEST", schema = "PUBLIC") 
@XmlRootElement 
@NamedQueries({ 
@NamedQuery(name = "Client.findAll", query = "SELECT c FROM Client c"), 
@NamedQuery(name = "Client.findByIdclient", query = "SELECT c FROM Client c WHERE c.idclient = :idclient"), 
@NamedQuery(name = "Client.findByLibel", query = "SELECT c FROM Client c WHERE c.libel = :libel"), 
@NamedQuery(name = "Client.findByAdresse", query = "SELECT c FROM Client c WHERE c.adresse = :adresse"), 
@NamedQuery(name = "Client.findByNomResp", query = "SELECT c FROM Client c WHERE c.nomResp = :nomResp"), 
@NamedQuery(name = "Client.findByTelPortable", query = "SELECT c FROM Client c WHERE c.telPortable = :telPortable"), 
@NamedQuery(name = "Client.findByTelFixe", query = "SELECT c FROM Client c WHERE c.telFixe = :telFixe"), 
@NamedQuery(name = "Client.findByFax", query = "SELECT c FROM Client c WHERE c.fax = :fax"), 
@NamedQuery(name = "Client.findByCodeTva", query = "SELECT c FROM Client c WHERE c.codeTva = :codeTva"), 
@NamedQuery(name = "Client.findByCodeExo", query = "SELECT c FROM Client c WHERE c.codeExo = :codeExo"), 
@NamedQuery(name = "Client.findByBanque", query = "SELECT c FROM Client c WHERE c.banque = :banque"), 
@NamedQuery(name = "Client.findByRib", query = "SELECT c FROM Client c WHERE c.rib = :rib"), 
@NamedQuery(name = "Client.findByCredit", query = "SELECT c FROM Client c WHERE c.credit = :credit"), 
@NamedQuery(name = "Client.findByEchance", query = "SELECT c FROM Client c WHERE c.echance = :echance"), 
@NamedQuery(name = "Client.findByMail", query = "SELECT c FROM Client c WHERE c.mail = :mail"), 
@NamedQuery(name = "Client.findByEtat", query = "SELECT c FROM Client c WHERE c.etat = :etat")}) 
public class Client implements Serializable { 
private static final long serialVersionUID = 1L; 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
@Basic(optional = false) 
@Column(name = "IDCLIENT", nullable = false) 
private Integer idclient; 
@Basic(optional = false) 
@Column(name = "LIBEL", nullable = false, length = 100) 
private String libel; 
@Basic(optional = false) 
@Column(name = "ADRESSE", nullable = false, length = 100) 
private String adresse; 
@Basic(optional = false) 
@Column(name = "NOM_RESP", nullable = false, length = 60) 
private String nomResp; 
@Basic(optional = false) 
@Column(name = "TEL_PORTABLE", nullable = false, length = 16) 
private String telPortable; 
@Basic(optional = false) 
@Column(name = "TEL_FIXE", nullable = false, length = 16) 
private String telFixe; 
@Basic(optional = false) 
@Column(name = "FAX", nullable = false, length = 16) 
private String fax; 
@Basic(optional = false) 
@Column(name = "CODE_TVA", nullable = false, length = 30) 
private String codeTva; 
@Basic(optional = false) 
@Column(name = "CODE_EXO", nullable = false, length = 30) 
private String codeExo; 
@Basic(optional = false) 
@Column(name = "BANQUE", nullable = false, length = 60) 
private String banque; 
@Basic(optional = false) 
@Column(name = "RIB", nullable = false, length = 22) 
private String rib; 
@Basic(optional = false) 
@Column(name = "CREDIT", nullable = false) 
private double credit; 
@Basic(optional = false) 
@Column(name = "ECHANCE", nullable = false) 
private int echance; 
@Basic(optional = false) 
@Column(name = "MAIL", nullable = false, length = 70) 
private String mail; 
@Basic(optional = false) 
@Column(name = "ETAT", nullable = false) 
private char etat; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientIdclient") 
private List<Facture> factureList; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientIdclient") 
private List<FactProforma> factProformaList; 
@OneToMany(cascade = CascadeType.ALL, mappedBy = "clientIdclient") 
private List<Bl> blList; 

public Client() { 
} 

public Client(Integer idclient) { 
    this.idclient = idclient; 
} 

public Client(Integer idclient, String libel, String adresse, String nomResp, String telPortable, String telFixe, String fax, String codeTva, String codeExo, String banque, String rib, double credit, int echance, String mail, char etat) { 
    this.idclient = idclient; 
    this.libel = libel; 
    this.adresse = adresse; 
    this.nomResp = nomResp; 
    this.telPortable = telPortable; 
    this.telFixe = telFixe; 
    this.fax = fax; 
    this.codeTva = codeTva; 
    this.codeExo = codeExo; 
    this.banque = banque; 
    this.rib = rib; 
    this.credit = credit; 
    this.echance = echance; 
    this.mail = mail; 
    this.etat = etat; 
} 

public Integer getIdclient() { 
    return idclient; 
} 

public void setIdclient(Integer idclient) { 
    this.idclient = idclient; 
} 

public String getLibel() { 
    return libel; 
} 

public void setLibel(String libel) { 
    this.libel = libel; 
} 

public String getAdresse() { 
    return adresse; 
} 

public void setAdresse(String adresse) { 
    this.adresse = adresse; 
} 

public String getNomResp() { 
    return nomResp; 
} 

public void setNomResp(String nomResp) { 
    this.nomResp = nomResp; 
} 

public String getTelPortable() { 
    return telPortable; 
} 

public void setTelPortable(String telPortable) { 
    this.telPortable = telPortable; 
} 

public String getTelFixe() { 
    return telFixe; 
} 

public void setTelFixe(String telFixe) { 
    this.telFixe = telFixe; 
} 

public String getFax() { 
    return fax; 
} 

public void setFax(String fax) { 
    this.fax = fax; 
} 

public String getCodeTva() { 
    return codeTva; 
} 

public void setCodeTva(String codeTva) { 
    this.codeTva = codeTva; 
} 

public String getCodeExo() { 
    return codeExo; 
} 

public void setCodeExo(String codeExo) { 
    this.codeExo = codeExo; 
} 

public String getBanque() { 
    return banque; 
} 

public void setBanque(String banque) { 
    this.banque = banque; 
} 

public String getRib() { 
    return rib; 
} 

public void setRib(String rib) { 
    this.rib = rib; 
} 

public double getCredit() { 
    return credit; 
} 

public void setCredit(double credit) { 
    this.credit = credit; 
} 

public int getEchance() { 
    return echance; 
} 

public void setEchance(int echance) { 
    this.echance = echance; 
} 

public String getMail() { 
    return mail; 
} 

public void setMail(String mail) { 
    this.mail = mail; 
} 

public char getEtat() { 
    return etat; 
} 

public void setEtat(char etat) { 
    this.etat = etat; 
} 

@XmlTransient 
public List<Facture> getFactureList() { 
    return factureList; 
} 

public void setFactureList(List<Facture> factureList) { 
    this.factureList = factureList; 
} 

@XmlTransient 
public List<FactProforma> getFactProformaList() { 
    return factProformaList; 
} 

public void setFactProformaList(List<FactProforma> factProformaList) { 
    this.factProformaList = factProformaList; 
} 

@XmlTransient 
public List<Bl> getBlList() { 
    return blList; 
} 

public void setBlList(List<Bl> blList) { 
    this.blList = blList; 
} 

@Override 
public int hashCode() { 
    int hash = 0; 
    hash += (idclient != null ? idclient.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 Client)) { 
     return false; 
    } 
    Client other = (Client) object; 
    if ((this.idclient == null && other.idclient != null) || (this.idclient != null && !this.idclient.equals(other.idclient))) { 
     return false; 
    } 
    return true; 
} 

@Override 
public String toString() { 
    return "glob.entitys.Client[ idclient=" + idclient + " ]"; 
    } 

} 

當我嘗試將行插入數據庫:

Utilisateur user=new Utilisateur(loginActuel); 
Client client=new Client(0);// the error comes from here 
Facture fact=new Facture(null,new Date()); 
fact.setClientIdclient(client); 
fact.setUtilisateurLogin(user); 
FactureJpaController fjc=new FactureJpaController(emf); 
fjc.create(fact); 

我得到這個醜陋的錯誤(但是當我設置new Client(1)它運作良好):

Exception in thread "AWT-EventQueue-0" javax.persistence.RollbackException: Exception [EclipseLink-7197] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ValidationException 

Exception Description: Null or zero primary key encountered in unit of work clone [glob.entitys.Client[ idclient=0 ]], primary key [0]. Set descriptors IdValidation or the "eclipselink.id-validation" property. 

如何解決這個問題?

句話:客戶idclient = 0已經被插入到數據庫中(但手動) 我想一勞永逸地解決這個「問題」,如何防止JPA或H2數據庫從0開始?

回答

2

H2允許使用0作爲主鍵。該錯誤消息不是來自H2。

但是,在我看來,EclipseLink的某些(舊版本)版本不允許使用0

客戶idclient = 0已經被插入到數據庫中

看來這是不支持此版本的EclipseLink的支持。它看起來像解決這個問題,你不應該使用值0

+0

是的,正如他說的Mikko Maunu JPA不支持零值作爲主鍵,感謝您澄清 – 2012-03-14 22:27:11

+0

JPA規範支持0作爲主鍵。 EclipseLink的老版本作爲其中一個實現不支持,並且這是EclipseLink中報告的錯誤。 – 2012-03-15 05:09:18

+0

已更新我的回答,說「舊版本的EclipseLink不支持0作爲主鍵值」,而不是「JPA規範不支持它」。 – 2012-03-15 06:06:16

1

對於具有(或負值)id的JPA(規範2.0)很好。也是H2的主要價值。

較早版本的EclipseLink確實將值0或更小視爲無效主鍵。請參閱以下示例:Bug 249948。因此更新EclipseLink可以提供幫助。

順便說一下,爲什麼你要爲應該生成的idclient設置構造函數值?

+0

感謝Link,Just實體Facture必須使用Client實例的實例(fact.setClientIdclient(client);)... – 2012-03-14 22:22:26

1

我有這個錯誤,並添加以下注釋到我的JPA身份解決它:

@Column(name = "ID_SEARCH_LOG", nullable = false, insertable = true, updatable = true, length = 10, precision = 0) 
@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int idSearchLog; 
2

有兩種方法如何允許在主鍵零中的EclipseLink:

參數在persistence.xml

<property name="eclipselink.id-validation" value="NULL"/> 

PrimaryKey註釋上關注實體類:

@PrimaryKey(validation = IdValidation.NULL)