2012-02-09 12 views
0

Я использую базу данных informix, и у меня есть две таблицы; экземпляр и контакт. Таблица контактов имеет следующие поля; contact_id, fname и lname. Таблица экземпляров имеет следующие поля: instance_id, name и contact_ids (contact_ids - коллекция набора идентификационных данных идентификаторов контактов, [email protected]). Я использую hibernate для сохранения данных. Код для моего экземпляра класса выглядит следующим образом:Извлечение набора примитивных типов из базы данных с использованием hibernate

@Entity 

public class Instance{ 

@Id 
private int instance_id; 

private String name; 

@Lob 
private Set<Integer> contact_ids 
    .... 
    setters and getters 

} 

Контакт Класс:

@Entity 

public class Contact{ 

@Id 
private int contact_id; 

private String fname; 

private String lname; 

    .... 

    setters and getters 
} 

Когда я загрузить экземпляр сущности, я получаю следующее сообщение об ошибке:

20:32:18,527 ERROR [jsp:154] java.sql.SQLException: **Can't convert to: binary stream** 
    at com.informix.util.IfxErrMsg.getSQLMinorException(IfxErrMsg.java:575) 
    at com.informix.jdbc.IfxObject.toBlob(IfxObject.java:647) 
    at com.informix.jdbc.IfxResultSet.getBlob(IfxResultSet.java:3338) 
    at com.informix.jdbc.IfxResultSet.getBlob(IfxResultSet.java:3437) 

Я просто хочу получить набор.

ответ

0

Попробуйте использовать @ElementCollection аннотацию следующим образом:

@ElementCollection 
    @CollectionTable(name="contact_ids", [email protected](name="instance_id")) 
    @Column(name="contact_id") 
    public Set<Integer> contactIds; 

Однако для сценария, я бы рекомендовал OneToMany отношения между реальными субъектами самостоятельно, так и в классе экземпляра, вместо поля contactIds, вы бы:

@OneToMany(fetch = FetchType.LAZY, mappedBy = "instance", cascade = {...}) 
    public Set<Contact> contacts; 

и в своем классе Контакты вы также могли бы иметь (чтобы соответствовать выше):

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "instance_id", referencedColumnName = "instance_id", nullable = false) 
public Instance instance; 
+0

Благодарим за решение. Я попробовал первый вариант, но имел ошибку следующим образом: –

+0

Я пробовал первый вариант, но имел следующую ошибку: Caused by: java.sql.SQLException: Указанная таблица (contact_ids) отсутствует в базе данных. Нет прямой связи между экземпляром и таблицами контактов. Единственное существующее отношение состоит в том, что в таблице экземпляров имеется коллекция идентификаторов контактов. В таблице контактов нет идентификатора экземпляра. Я работаю над существующей базой данных, и я не хочу менять структуру таблицы. Я думал, так как поле contact_ids представляет собой коллекцию, есть способ получить коллекцию, не создавая никакой ассоциации, как получение даты или строки. –

+0

Ухх, я не понимал, что структура базы данных исправлена, и вы не хотели ее менять. В этом случае ни одно решение не будет немедленно работать. –

0

Вы должны настроить Ваш Informix typeHandeler:

если вы используете myBatis добавить:

<typeHandlers> 
    <typeHandler javaType="string" jdbcType="BLOB" handler="org.apache.ibatis.type.StringTypeHandler"/> 
</typeHandlers> 

в вашем файле mybatis-config.xml

намек: "javaType" должен быть Ваш желаемый тип

Смежные вопросы