jpa(eclipselink)继承中的Id生成器返回随机值

时间:2015-03-31 15:19:18

标签: java entity-framework jpa inheritance eclipselink

我在我的网络应用程序中使用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时获得的(这是合乎逻辑的,因为它扩展了另一个实体):

enter image description here

任何人都可以帮我解决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 ] enter image description here

然后我删除这一行并使用相同的代码创建另一个实例,然后我得到:

enter image description here

[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 ??

0 个答案:

没有答案