我在我的网络应用程序中使用eclipselink(我使用带有oracle的vaadin作为DATABASE),但我遇到了Id值的问题。
我有这个简单的架构:
encaiss (@MappedSuperclass contains just Id)
|
|
Encaissement (it extends encaiss so as to have the ID)
/ \
/ \
Encaissement_Technique (extends Encaissement) Encaissement_espece
/ \
/ \
Encaissement_Cheque Encaissement_Virement (both extend Encaissement_Technique to have the ID)
例如,当我创建一个Encaissement_virement实例时,生成的Id是随机的,尽管我设置 allocationSize = 1,initialValue = 1 。
这些是实体:
====================实体encaiss(仅包含ID)==============
@MappedSuperclass
public abstract class encaiss {
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="encaiss_seq_gen")
@SequenceGenerator(name="encaiss_seq_gen", sequenceName="ENCAISSEMENT_SEQ", allocationSize = 1, initialValue = 1)
protected long id_encaissement;
public long getId_encaissement() {
return id_encaissement;
}
public void setId_encaissement(long id_encaissement) {
this.id_encaissement = id_encaissement;
}
}
============================实体Encaissement ============== =========
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ENCAISS_TYPE")
@Table(name="ENCAISSEMENT")
public class Encaissement extends encaiss implements Serializable{
@Column(name="LIBELLE")
protected String libelle;
@Column(name="PIECE_JOINTE")
protected String piece_jointe;
@Temporal(TemporalType.DATE)
@Column(name="DATE_ENCAISSEMENT")
protected Date date_encaissement;
@Embedded
protected Avis_Recette avis_recette;
public Encaissement(String libelle, String piece_jointe, Date date_encaissement){
this.libelle=libelle;
this.piece_jointe=piece_jointe;
this.date_encaissement=date_encaissement;
}
public Encaissement(){
}
}
====================实体Encaissement_Technique ======================
@Entity
@DiscriminatorValue("Technique")
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(name="ENCAISS_TECHNIQUE_TYPE")
@Table(name="ENCAISSEMENT_TECHNIQUE")
public class Encaissement_Technique extends Encaissement implements Serializable{
public Encaissement_Technique(){
}
}
====================实体Encaissement_Cheque ====================== ==
@Entity
@DiscriminatorValue("C")
@Table(name="ENCAISSEMENT_CHEQUE")
public class Encaissement_Cheque extends Encaissement_Technique{
@Column(name="ETAT_AVISCREDIT")
private String etat_avisCredit;
@Embedded
private Cheque cheque;
public Encaissement_Cheque(String etat_avisCredit, Date date_encaissement){
this.etat_avisCredit=etat_avisCredit;
this.date_encaissement=date_encaissement;
}
public Encaissement_Cheque(){
}
}
====================实体Encaissement_Virement ====================== =
@Entity
@DiscriminatorValue("V")
@Table(name="ENCAISSEMENT_VIREMENT")
public class Encaissement_Virement extends Encaissement_Technique{
@Temporal(TemporalType.DATE)
@Column(name="DATE_VIREMENT")
private Date date_virement;
public Encaissement_Virement(Date date_virement, String libelle, String piece_jointe, Float primCoass, Date date_encaissement){
this.date_virement=date_virement;
this.primeCoass=primCoass;
this.piece_jointe=piece_jointe;
this.libelle=libelle;
this.date_encaissement=date_encaissement;
}
public Encaissement_Virement(){
}
}
我是从eclipse创建的一个Encaissement_virement实例,生成的id是71然后当我创建另一个它给它75,之后它跳到91!然后它在每次插入后添加3(我的意思是id = 103然后106然后是109)!!!!!
PS:当我执行时
Encaissement_virement ev=new Encaissement_virement();
//ev.getters and setters
ev.getId_Encaissement(); 不会返回真实身份而非返回0 是否在提交之前或之后调用。
这个问题让我发疯,我无法弄清楚问题。 (我认为继承id或id类型(很长)不起作用。)
感谢您的帮助。感谢。
编辑:
在使用sql developer之后,我确信问题出在继承中。
这是我在尝试插入Encaissement_virement时获得的(这是合乎逻辑的,因为它扩展了另一个实体):
任何人都可以帮我解决jpa eclipselikn中的继承问题。再次感谢。
EDIT2
我使用以下代码创建一个新的Encaissement_virement实例:
JPAContainer<Encaissement_Espece> ee=JPAContainerFactory.make(Encaissement_Espece.class, PERSISTANCE_UNIT);
Encaissement_Espece encaissEspece;
JPAContainer<Encaissement_Cheque> ec=JPAContainerFactory.make(Encaissement_Cheque.class, PERSISTANCE_UNIT);
Encaissement_Cheque encaissCheque;
JPAContainer<Encaissement_Virement> ev=JPAContainerFactory.make(Encaissement_Virement.class, PERSISTANCE_UNIT);
Encaissement_Virement encaissVirement;
//Some code here.
switch (typeEncaissement) {
case 0:
encaissEspece=new Encaissement_Espece();
encaissEspece.setCaisse(caisseEnc);
encaissEspece.setDate_encaissement(dateEnc);
encaissEspece.setLibelle(libelleEnc);
encaissEspece.setMontant(montantEncEspece);
encaissEspece.setPiece_jointe(pieceJointesEnc);
encaissEspece.setClient(clientEnc);
//UUID uuid = (UUID)ee.addEntity(encaissEspece);
//EntityItem<Encaissement_Espece> eeEntityItem = ee.getItem(uuid);
IdEnc=(Long)ee.addEntity(encaissEspece);
ee.commit();
break;
case 1:
encaissCheque=new Encaissement_Cheque();
encaissCheque.setBanque(banqueEnc);
encaissCheque.setCheque(chequeEnc);
encaissCheque.setClient(clientEnc);
encaissCheque.setDate_encaissement(dateEnc);
encaissCheque.setLibelle(libelleEnc);
encaissCheque.setPiece_jointe(pieceJointesEnc);
encaissCheque.setPrimeCoass(primeCoassEnc);
IdEnc=(Long)ec.addEntity(encaissCheque);
ec.commit();
break;
case 2:
encaissVirement=new Encaissement_Virement();
encaissVirement.setBanque(banqueEnc);
encaissVirement.setClient(clientEnc);
encaissVirement.setDate_encaissement(dateEnc);
encaissVirement.setLibelle(libelleEnc);
encaissVirement.setPiece_jointe(pieceJointesEnc);
encaissVirement.setPrimeCoass(primeCoassEnc);
encaissVirement.setDate_virement(dateVir);
IdEnc=(Long)ev.addEntity(encaissVirement);
ev.commit();
break;
default:
break;
这是结果(一个66作为id的新实例): [EL精细]:sql:2015-04-01 17:25:45.301 - ServerSession(5981709) - 连接(27335918) - 线程(线程[http-bio-8080-exec-5,5,main]) - 从DUALSELECT ENCAISSEMENT_SEQ.NEXTVAL
[EL Fine]:sql:2015-04-01 17:25:45.316 - ClientSession(26722029) - 连接(27335918) - 线程(线程[http-bio-8080-exec-5,5,主要]) - 插入确认(ID_ENCAISSEMENT,DATE_ENCAISSEMENT,LIBELLE,PIECE_JOINTE,AGENCE,DATE_AVIS_RECETTE,ENDROIT,来源,UNITE,ID_CLIENT,ENCAISS_TYPE)价值观(?,?,?,?,?, ?,?,?,?,?,?) bind =&gt; [ 66 ,2015-04-01,titre,jointes,null,null,null,null,null,2,V]
[EL Fine]:sql:2015-04-01 17:25:45.795 - ClientSession(26722029) - 连接(27335918) - 线程(线程[http-bio-8080-exec-5,5,主要]) - INSERT INTO ENCAISSEMENT_TECHNIQUE (PRIMECOASS,ID_BANQUE,ID_ENCAISSEMENT)价值观(?,?,?) bind =&gt; [123.0,1, 66 ]
[EL Fine]:sql:2015-04-01 17:25:45.936 - ClientSession(26722029) - 连接(27335918) - 线程(Thread [http-bio-8080-exec-5,5, main]) - INSERT INTO ENCAISSEMENT_VIREMENT (DATE_VIREMENT,ID_ENCAISSEMENT)值(?,?) bind =&gt; [2015-04-01, 66 ]
然后我删除这一行并使用相同的代码创建另一个实例,然后我得到:
[EL Fine]:sql:2015-04-01 17:30:42.119 - ServerSession(27444543) - 连接(6011948) - 线程(线程[http-bio-8080-exec-15,5, main]) - 选择ENCAISSEMENT_SEQ.NEXTVAL FROM DUAL
[EL Fine]:sql:2015-04-01 17:30:42.13 - ClientSession(1011455) - Connection(6011948) - Thread(Thread [http-bio-8080-exec-15,5,主要]) - 插入确认(ID_ENCAISSEMENT,DATE_ENCAISSEMENT,LIBELLE,PIECE_JOINTE,AGENCE,DATE_AVIS_RECETTE,ENDROIT,来源,UNITE,ID_CLIENT,ENCAISS_TYPE)价值观(?,?,?,?,?, ?,?,?,?,?,?) bind =&gt; [ 69 ,2015-04-01,titre,j,null,null,null,null,null,4,V]
[EL Fine]:sql:2015-04-01 17:30:42.195 - ClientSession(1011455) - Connection(6011948) - Thread(Thread [http-bio-8080-exec-15,5,主要]) - INSERT INTO ENCAISSEMENT_TECHNIQUE (PRIMECOASS,ID_BANQUE,ID_ENCAISSEMENT)价值观(?,?,?) bind =&gt; [123.0,1, 69 ]
[EL Fine]:sql:2015-04-01 17:30:42.211 - ClientSession(1011455) - Connection(6011948) - Thread(Thread [http-bio-8080-exec-15,5, main]) - INSERT INTO ENCAISSEMENT_VIREMENT (DATE_VIREMENT,ID_ENCAISSEMENT)值(?,?) bind =&gt; [2015-04-01, 69 ]
你可以注意到,而不是得到67,因为我得到69 ??