Problemer med RequiresNew trans-attribute
I bogen EJB design patterns, som kan downloades fra www.theserverside.com, er jeg faldet over en CMPløsning til generering af primærnøgler. Jeg har forsøgt benytte dette 'pattern' i Netbeans4.1 og Sun's applicationserver 8.11, men er løbet ind i et transaktionsproblem. I bogen fremhæves det, at CMP-metoden getValueAfterIncrementingBy(int blockSize), som henter og reserverer en portion primærnøgleværdier, skal registreres i ejb-jar.xml med transaktionsattributen RequiresNew, så metoden ikke risikere at blive en del af en langvarig transaktion.Kort fortalt kan problemet beskrives sådan:
Jeg ønsker at genere primærnøgleværdier for tabellen MYTABLE.
Tabellen MYPRIMKEY_TBL, som holder styr på nøgleværdier, har to kolonner, en primærnøgle 'NAME' (CHAR(20)) og INDEX (INTEGER).
Hvis tabellen MYPRIMKEY_TBL allerede har en række med NAME = 'MYTABLE' virker følgende korrekt
String name = "MYTABLE";
MyPrimkeyTblLocalHome meHome = lookupMeEntityTblBean();
MyPrimkeyTblLocal me = meHome.findByPrimaryKey(name);
int primKeyVal = me.getValueAfterIncrementingBy(blockSize);
Indeholder tabellen MYPRIMKEY_TBL ikke en række med NAME = 'MYTABLE', så skal rækken oprettes. Men følgende kode kaster en exception com.sun.jdo.api.persistence.support.JDOObjectNotFoundException: JDO76210: Object does not exist in the data store.
FailedObjectArray:
String name = "MYTABLE";
MyPrimkeyTblLocalHome meHome = lookupMeEntityTblBean();
MyPrimkeyTblLocal me = meHome.create(name);
int primKeyVal = me.getValueAfterIncrementingBy(blockSize);
Sætter jeg derimod transaction attributen til Required, så virker begge kodeeksempler.
Min egen fornemmelse er, at da transaktionen med meHome.create(name) ikke committes før metoden me.getValueAfterIncrementingBy(blockSize) på grund af 'RequiresNew' , kan me.getValueAfterIncrementingBy(blockSize) ikke læse entity-bønnen dannet ved create. Når der blot slås op med meHome.findByPrimaryKey(name) opstår dette problem ikke. Mon det er sådan det hænger sammen? og kan jeg gøre noget for at omgå problemet?
Sten