SQLJ создал неверный код Java - PullRequest
0 голосов
/ 09 марта 2011

, хотя я был старым пользователем Сайта, но раньше мне удавалось решить проблемы самостоятельно. На этот раз мне нужен твой совет:)

Ситуация: Я унаследовал старый код проекта Java, где SQLJ используется для доступа к базе данных. В проекте не нужны ни база данных, ни SQLJ, но я не могу изменить историю, поэтому приходится с ней мириться. Другая часть истории заключается в том, что разработка делалась в JDeveloper раньше, однако новые стандарты компании требуют Eclipse (лучший продукт в моих предпочтениях).

Но у меня проблема с переносом SQLJ для автоматической сборки с использованием Ant с использованием javac вместо компилятора Oracle. Итак, возникает проблема:

Java-файлы, сгенерированные SQLJ, недопустимы для компилятора javac из-за различий в структуре пакета. Однако JDeveloper (11.1.1.0.2) принимает такие java-файлы, поскольку он использует старый компилятор oracle. Пример обоих sqlj и Java, чтобы лучше объяснить проблему:

SQLJ

package Sess;
public class UserDB extends Object implements SessConstants
{
    #sql public static iterator  UserIterator(
         String              m
<cut off>
      );
<cut off>

private static UserIterator   UserIter  = null;
}

public static boolean readNext(User theUser )
  throws SQLException
  {
    if (iteratorOpen == false)
    {
     #sql UserIter = {
        select
          m
          <cut off>
   from
          <cut off>
  };

  iteratorOpen = true;
  <cut off>

Сгенерированный JAVA:

package Sess;
public class UserDB extends Object implements SessConstants
{
public static class UserIterator
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
<cut off>
public static boolean readNext(User theUser )
throws SQLException
{
if (iteratorOpen == false)
{
<cut off>

{
<cut off>

UserIter = new Sess.UserDB.UserIterator(new 
...
<cut off>

Проблема с последним утверждением

UserIter = new Sess.UserDB.UserIterator(new     ...

На самом деле должно быть:

UserIter = new UserDB.UserIterator(new 

Тогда все в порядке.

Обратите внимание, что в более новых версиях JDeveloper возникает та же проблема, что и в javac (как мне кажется).

В качестве обходного пути мы храним Java-файлы вместе с SQLJ, и после того, как мы регенерируем Java из SQLJ-изменения, мы снова исправляем Java. Не совсем рад сделать это вручную, поскольку это делает недействительной процедуру автоматической сборки для случаев, когда нужно обновить SQLJ.

У кого-нибудь есть идеи? Ваша помощь очень ценится:)

Приветствия

1 Ответ

0 голосов
/ 13 апреля 2011

Ну, мало что я могу получить в ответ, хотя это разумно - тема редкая.Не так много, что я тоже нашел себя.Похоже, существует проблема с ant и sqlj, которую необходимо устранить.

Фактически нам пришлось идти в ногу с оригинальным обходным решением.то есть мы компилируем sqlj, затем изменяем файлы вручную (это делает сценарий), а затем компилируем.Некрасиво но работает.

...