Помощь, необходимая для JPA / hibernate - проблемы с созданием классов сущностей - PullRequest
3 голосов
/ 23 сентября 2010

Я начал создавать отображения JPA / hibernate для устаревшей базы данных на базе Oracle.В одной (ранней ...) точке у меня есть отношение многие ко многим между таблицами (FOO, BAR, таблица соединений с дополнительными полями: FOO_BAR).Итак, я определил три сущности, создал встраиваемый класс Id для таблицы соединений, строго следуя некоторым примерам из хорошей (?!) Книги.

Я могу выбрать Foo, но всякий раз, когда я пытаюсь прочитать соответствующие столбцы изВ результате я получаю «SQLException: данные не найдены» или «SQLException: Общая ошибка (S1000)».Я могу переключаться между ними, просто меняя некоторые java-типы бинов сущности ...

Журнал содержит следующую строку и случай ошибки "No data found":

INFO org.hibernate.type.LongType - could not read column value from result set: Foo1_2_; No data found

Столбцы FOO_ID и BAR_ID определены как NUMBER(22).Сначала я попробовал Long типов, это привело к «Нет данных», Double привело к «Общая ошибка».Затем я где-то прочитал, что стандартное сопоставление для NUMBER - BigDecimal (-> «Общая ошибка»), вместо этого я попытался BigInteger (-> «Данные не найдены»).

Япотерян.

Когда я беру оператор sql из журналов и использую его с "нативным" jdbc, ... он работает нормально.

PreparedStatement prep = con.prepareStatement(sqlQueryFromHibernateLogs);
prep.setBigDecimal(1, new  BigDecimal(1));
ResultSet rs = prep.executeeQuery();  // result set has the correct values...

Любая помощь, предложения, указатели на полезныересурсы высоко ценятся.О, еще одна вещь, которую стоит упомянуть: я «вынужден» использовать мост JdbcOdbc.Это действительно устаревшая система ...


Мое предложение select выглядит следующим образом:

List<Foo> foos = em.createQuery("select f from Foo f order by f.name").getResultList();

Редактировать

Версии- Я связан с библиотеками гибернации, которые поставляются с игровой платформой (1.0.3.2).Hibernate3.jar не имеет полезной информации о версии (ничего в Manifest, Version#getVersionString() говорит [WORKING]), другие jars hibernatexxx сообщают как 3.1.0.GA (валидатор) или 3.4.0.GA (entitymanager).


Редактировать 2

Я сократил классы до абсолютного минимума с сохраняющимися ошибками.Вот что я сделал:

Foo.java

@Entitiy @Table(name="FOO")
public class Foo {
  @Id @Column(name="FOO_ID")
  private BigInteger fooId;

  Foo(){}

  @OneToMany(mappedBy="foo")
  private Set<FooBar> fooBars = new HashSet<FooBar>();
}

Bar.java

@Entitiy @Table(name="BAR")
public class Bar {
  @Id @Column(name="BAR_ID")
  private BigInteger fooId;

  Bar(){}

  @OneToMany(mappedBy="bar")
  private Set<FooBar> fooBars = new HashSet<FooBar>();
}

FooBar.java

@Entitiy @Table(name="FOOBAR")
public class FooBar {

  @Embeddable
  public static class Id implements Serializable {
    @Column(name="FOO_ID")
    private BigInteger fooId;
    @Column(name="BAR_ID")
    private BigInteger barId;

    Id() {}

    // implementations of hashcode and equals

  }

  @Embedded
  private Id id = new Id();

  @ManytoOne @JoinColumn(name = "FOO_ID", insertable=false, updatable=false)
  private Foo foo;

  @ManytoOne @JoinColumn(name = "BAR_ID", insertable=false, updatable=false)
  private Bar bar;

  FooBar(){}
}

FOO_ID и BAR_ID определены как NUMBER(22) в базе данных Oracle.Приведенный выше пример приводит к ошибке «Данные не найдены», замена BigInteger на Long приводит к «Общей ошибке».И отправка того же выражения SQL через мост дает правильный набор результатов ...

1 Ответ

0 голосов
/ 24 сентября 2010

Нашел решение или - по крайней мере - обнаружил, что этот подход не может работать с данными инструментами (hibernate, JdbcOdbc bridge):

Еще один поиск в Google наконец отправил меня на thisнемецкий) страница , где у кого-то была похожая проблема: исключение No data found SQLE при работе с мостом.Кто-то еще ответил, что код правильный, но это проблема с мостом JdbcOdbc, который не поддерживает чтение набора результатов более одного раза.Я не могу уточнить, если у меня есть такая же проблема здесь, но я уверен, что это тот или иной случай, и проблема связана с использованием моста с Hibernate / JPA.

Для моегоочень особый случай: я решил проблему, проигнорировав ее после ... наконец-то выяснив, что я могу использовать драйвер oracle oci.( вздох )

Спасибо всем, кто пытался следить за моими постами и думал о решении!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...