Я начал создавать сопоставления JPA/hibernate для устаревшей базы данных на основе Oracle. В одной (ранней ...) точке у меня есть отношение «многие ко многим» между таблицами (FOO, BAR, join table с дополнительными полями: FOO_BAR). Таким образом, я определил три объекта, создал встроенный класс Id для таблицы join, строго следуя некоторым примерам из хорошей (?!) Книги.Помощь, необходимая для JPA/hibernate - проблемы с созданием классов сущностей
Я могу выбрать Foo, но всякий раз, когда я пытаюсь прочитать связанные бары из результирующего набора, я получаю wither «SQLException: данных не найдено» или «SQLException: Общая ошибка (S1000)». Я могу переключаться между ними, просто изменив некоторые типы Java бобов сущностей ...
Журнал содержит следующую строку п случай «Нет данных» Ошибка:
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. Это действительно традиционная система ...
Мой оператор выбора выглядит следующим образом:
List<Foo> foos = em.createQuery("select f from Foo f order by f.name").getResultList();
Редактировать
Версии - я связан с библиотеками Hibernate, что поставляются с игровой картой (1.0.3.2). В hibernate3.jar нет полезной информации о версии (ничего в Manifest, Version#getVersionString()
не указано [WORKING]
), другие баны hibernatexxx относятся к 3.1.0.GA (validator) или 3.4.0.GA (entitymanager).
Edit 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 над мостом дает правильный результат ...
* Я вынужден использовать мост JdbcOdbc * О, мой ... В случае, если это может быть актуальным, какой диалект вы используете? Какая версия Hibernate? –
@Pascal - диалект «Oracle10gDialect», спящий режим - 3-точка-что-то (нужно искать его). Но, как я уже сказал, родной jdbc (то же утверждение) работает с мостом ... –
Да, я понял. Но Hibernate участвует в этом вопросе, IMO :) –