Получение набора примитивных типов из базы данных с использованием спящего режима

Я использую базу данных informix, и у меня есть две таблицы; экземпляр и контакт. Таблица контактов имеет следующие поля; contact_id, fname и lname. Таблица экземпляров имеет следующие поля: instance_id, имя и contact_ids (contact_ids — это набор идентификаторов контактов, com.informix.jdbc.IfxCollection@429681e8). Я использую спящий режим для сохранения данных. Код для моего экземпляра класса выглядит так:

@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)

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


person Godwin Anasigre    schedule 09.02.2012    source источник


Ответы (2)


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

   @ElementCollection
   @CollectionTable(name="contact_ids", joinColumns=@JoinColumn(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;
person Michael-7    schedule 09.02.2012
comment
Спасибо за решение. Я попробовал первый вариант, но получил следующую ошибку: - person Godwin Anasigre; 10.02.2012
comment
Я попробовал первый вариант, но получил следующую ошибку: Вызвано: java.sql.SQLException: Указанная таблица (contact_ids) отсутствует в базе данных. Прямой связи между экземплярами и контактными таблицами нет. Единственная существующая связь заключается в том, что таблица экземпляров содержит набор идентификаторов контактов. Таблица контактов не имеет идентификатора экземпляра. Я работаю с существующей базой данных и не хочу менять структуру таблицы. Я подумал, что, поскольку поле contact_ids представляет собой коллекцию, существует способ получить коллекцию без создания какой-либо ассоциации, как при получении даты или строки. - person Godwin Anasigre; 10.02.2012
comment
Э-э, я не знал, что структура базы данных была фиксированной, и вы не хотели ее менять. В этом случае ни одно из решений не сработает сразу. - person Michael-7; 10.02.2012

Вам необходимо настроить свой Informix typeHandeler:

предполагая, что вы используете myBatis, добавьте:

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

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

подсказка: "javaType" должен быть вашим желаемым типом

person JJB    schedule 03.08.2017