【问题标题】:Retrieving a set of primitive types from a database using hibernate使用休眠从数据库中检索一组原始类型
【发布时间】:2012-02-09 20:45:49
【问题描述】:

我正在使用一个 informix 数据库,我有两个表;实例和联系方式。联系人表有以下字段; contact_id、fname 和 lname。实例表有以下字段,instance_id、name和contact_ids(contact_ids是一个informix set的contact id集合,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)

我只是想检索集合。

【问题讨论】:

    标签: hibernate set lob


    【解决方案1】:

    尝试使用@ElementCollection注解如下:

       @ElementCollection
       @CollectionTable(name="contact_ids", joinColumns=@JoinColumn(name="instance_id"))
       @Column(name="contact_id")
       public Set<Integer> contactIds;
    

    但是,对于您的场景,我建议在实际实体本身之间建立 OneToMany 关系,因此在您的实例类中,您将拥有:

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

    【讨论】:

    • 感谢您的解决方案。我尝试了第一个选项,但出现如下错误:
    • 我尝试了第一个选项,但出现如下错误:原因:java.sql.SQLException:指定的表(contact_ids)不在数据库中。实例表和联系表之间没有直接关系。唯一存在的关系是实例表有一组联系人 ID。联系人表没有实例 ID。我正在处理现有数据库,我不想更改表结构。我在想,因为 contact_ids 字段是一个集合,所以有一种方法可以在不创建任何关联的情况下检索集合,就像检索日期或字符串一样。
    • 呃,我没有意识到数据库结构是固定的,你不想改变它。在这种情况下,这两种解决方案都不会立即起作用。
    【解决方案2】:

    您需要自定义 Informix typeHandler:

    假设你正在使用 myBatis 添加:

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

    在你的 mybatis-config.xml 文件中

    提示:“javaType”应该是您想要的类型

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多