Когда EJB-объект EJB CMP фактически создан
У меня есть сессионный компонент, который предоставляет бизнес-метод, в котором он создает несколько объектов CMP, что-то вроде этого
public void businessMethod(int number) {
try {
MyBeanHome home = lookupMyBean();
DataSource dataSource = getMyDataSource();
Statement statement = dataSource.getConnection().createStatement();
ResultSet result;
String tableName = "MYBEAN";
for (int i = 0; i < number; i++) {
result = statement.executeQuery("select max(ID) + 1 from " + tableName);
result.next();
int newID = result.getInt(1);
System.out.println(newID);
MyBeanLocal lineLocal = home.create(newID);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
Метод создания MyBean
просто создает новый бин с newID
, Однако приведенный выше код работает только с number = 1
, Если number > 1
пытается создать второй компонент с тем же идентификатором (System.out.println(newID);
печатает то же значение). Я предполагаю, что новый компонент еще не сохранен в базе данных, и, следовательно, запрос возвращает то же значение. Что с этим можно сделать?
Большое спасибо!
1 ответ
Решение
Я понял, что транзакция выполняется только тогда, когда бизнес-метод завершается, поэтому первые сущностные компоненты не будут храниться в базе данных для извлечения. Простое решение ниже
public void businessMethod(int number) {
try {
MyBeanHome home = lookupMyBean();
DataSource dataSource = getMyDataSource();
Statement statement = dataSource.getConnection().createStatement();
ResultSet result;
String tableName = "MYBEAN";
result = statement.executeQuery("select max(ID) + 1 from " + tableName);
result.next();
int newID = result.getInt(1);
for (int i = 0; i < number; i++) {
System.out.println(newID);
MyBeanLocal lineLocal = home.create(newID++);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}