Я начал создавать отображения 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 через мост дает правильный набор результатов ...