Wykrywanie automatycznie wygenerowanych kluczy Oracle

Deskryptory wdrażania WebLogic dla trwałych komponentów bean zarządzanych przez kontener umożliwiają aplikacjom korzystanie z funkcji automatycznego generowania sekwencji bazy danych (kluczy). Gdy używana jest ta funkcja, aplikacja WebLogic nie musi zawierać kodu do wygenerowania następnego klucza sekwencji podczas tworzenia obiektów EJB CMP. Podczas migrowania aplikacji WebLogic, które zawierają automatyczne generowanie sekwencji, należy dodać kod aplikacji w celu wygenerowania identyfikatora sekwencji dla nowych pozycji.

Plik weblogic-cmp-rdbms-jar.xml zawiera informacje dla komponentów EJB jednostek, które korzystają z trwałości opartej na systemie RDBMS produktu WebLogic. Ta reguła skanuje konfigurację elementów automatic-key-generation produktu WebLogic i udostępnia informacje dotyczące migracji dla generatora typu Oracle. W tym przykładzie przedstawiono element, który zostanie oznaczony przez tę regułę:

< weblogic-rdbms-bean>
<ejb-name>Karta</ejb-name>
<data-source-name>MyDataŹródło</data-source-name>
<table-name>MOJA_TABELA</table-name>
...
< span class= "indent2"> < /span> < automatyczne generowanie klucza >
<generator-type>Oracle</generator-type>
<generator-name>id_sekwencji</generator-name>
<key-cache-size>10</key-cache-size>
</automatic-key-generation>
...
</weblogic-rdbms-bean>

Pozycja generator-name wskazuje nazwę z tabeli DUAL Oracle, która ma zostać użyta do wygenerowania następnej sekwencji. Na przykład dla pozycji generator_name o wartości sequence_id można użyć następującej instrukcji SQL do wygenerowania następnego numeru sekwencji.

select sequence_id.NEXTVAL from dual;

Jeśli ta reguła spowoduje oznaczenie pozycji w deskryptorze wdrażania weblogic-cmp-rdbms-jar.xml, konieczne będzie podjęcie kroków w celu ręcznego zmodyfikowania kodu EJB w celu utworzenia kluczy. Kroki te należy wykonać przed ponownym wygenerowaniem kodów pośredniczących EJB dla serwera WebSphere Application Server. W poniższych przykładach przedstawiono potencjalną ścieżkę migracji.

W poniższych przykładach wysokiego poziomu przedstawiono sposób wymiany funkcjonalności logiki kluczy generowanych automatycznie przez Oracle. Należy napisać podobny kod dla każdego komponentu bean CMP, który używa numerów sekwencji generowanych automatycznie przez Oracle. Istnieje możliwość utworzenia narzędziowych klas pomocniczych w celu połączenia wspólnej logiki generującej numery sekwencji dla każdego komponentu bean.

Dodaj parametr dla numeru sekwencji do metod ejbCreate i ejbPostCreate komponentu bean jednostki.

Przed:

public Integer ejbCreate(String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
...

public Integer postCreate(String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
...

Po:

public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
...

public Integer postCreate(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
...

Ustaw numer sekwencji w odpowiednim polu komponentu EJB w metodzie ejbCreate.

public Integer ejbCreate(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException
{
...
setCardID(sequenceID);
...
}

Dodaj parametr dla numeru sekwencji do metody create interfejsu podstawowego komponentów EJB.

Przed:

public Card create(String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException;

Po:

public Card create(Integer sequenceID, String cardNumber, String lastName, String firstName,
java.sql.Date issueDate) throws CreateException;

Dodaj logikę, aby uzyskać następny numer sekwencji dla komponentu bean jednostki CMP.

String sqlQuery = "select sequence_id.NEXTVAL from dual";
PreparedStatement prepStmt = con.prepareStatement(sqlQuery);

ResultSet rs = prepStmt.executeQuery();
if(rs != null) {
rs.next();
nextKey = rs.getInt("NEXTVAL");
}

Zmodyfikuj kod, w którym metoda create() interfejsu podstawowego komponentów EJB jest wywoływana w celu przekazania następnego numeru sekwencji.

Card card = cardHome.create(nextKey, cardNumber, lastName, firstName, newDate);