2010-09-23 3 views
3

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

+1

* Я вынужден использовать мост JdbcOdbc * О, мой ... В случае, если это может быть актуальным, какой диалект вы используете? Какая версия Hibernate? –

+0

@Pascal - диалект «Oracle10gDialect», спящий режим - 3-точка-что-то (нужно искать его). Но, как я уже сказал, родной jdbc (то же утверждение) работает с мостом ... –

+0

Да, я понял. Но Hibernate участвует в этом вопросе, IMO :) –

ответ

0

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

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

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

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

+0

Перед тем, можно будет пометить любой BigInteger @Column как @Column (presicion = 22) и посмотреть, что произойдет. Хотя точность используется для значений BigDecimal (http://download.oracle.com/javaee/5/api/javax/persistence/Column.html#precision%28%29) Она работает при использовании BigInteger (http: // stackoverflow .com/вопросы/2916838) –