【问题标题】:"could not initialize a collection" + @Lob + MSSQL“无法初始化集合” + @Lob + MSSQL
【发布时间】:2011-04-04 19:55:49
【问题描述】:

在 n 到 m 关系中使用 Blob 字段时,HibernateMSSQL 因某种原因而失败。

SQL Error: 421, SQLState: S0001
The image data type cannot be selected as DISTINCT because it is not comparable.
...
could not initialize a collection: [Dataset.documents#someID]

我的课程如下所示:

@Entity
class Dataset {
    @OneToMany(fetch = FetchType.LAZY)
    public List<Document> documents = new ArrayList<Document>();
}

@Entity
class Document {
    @Id
    public long id;

    @Lob
    public byte[] data;
}

对此有什么想法吗?我已经尝试使用SetDocument[] 来避免错误。似乎 Hibernate 总是在我的表上尝试不同的 SELECT。我该如何解决这个问题?

[1]MSSQL error codes

【问题讨论】:

    标签: java sql-server hibernate orm jpa-2.0


    【解决方案1】:

    发布执行的查询和表格会很有趣。但我能想到的两种映射(单向一对多与双向)之间的一个区别是它们在数据库级别的表示方式。

    默认情况下,单向一对多将使用连接表:

    DATASET       DATASET_DOCUMENT       DOCUMENT
    -------       ----------------       --------
    ID            DATASET_ID             ID
                  DOCUMENT_ID
    

    双向将使用以下表示:

    DATASET       DOCUMENT  
    -------       ----------
    ID            ID        
                  DATASET_ID
    

    在 JPA 2.0 中,现在可以通过在 @OneToMany 一侧指定 @JoinColumn 来使用没有连接表的单向关联(以标准方式):

    @Entity
    class Dataset {
        @Id
        @Column(name="ID")
        public Long id;
        ...
        @OneToMany
        @JoinColumn(name="DATASET_ID", referencedColumnName="ID")
        public List<Document> documents = new ArrayList<Document>();
    }
    

    我会试试上面的。

    参考文献

    【讨论】:

    • 你是对的,这正是它的做法。谢谢你的解释。
    【解决方案2】:

    我设法通过添加对我的Document 类的反向引用来解决问题。我相信有更直接的方法,因为我根本不需要这个参考,所以它基本上只能帮助解决问题。

    @Entity
    class Dataset {
        @OneToMany(fetch = FetchType.LAZY, mappedBy = "dataset")
        public List<Document> documents = new ArrayList<Document>();
    }
    
    @Entity
        class Document {
        @Id
        public long id;
    
        @Lob
        public byte[] data;
    
        @ManyToOne
        @JoinColumn
        public Dataset dataset;
    }
    

    【讨论】:

      【解决方案3】:

      我已经用另一种方式解决了这个问题。 我的 OneToMay 上已经有 mappedBy = "enrollment",在 ManyToOne 上我有 @JoinColumn(name="enrollment", nullable=true)。所以这不是关系问题。

      相反,我在 hibernate 论坛上发现了一个帖子,建议覆盖方言类中的 supportsUnionAll()。它默认返回 false,但 SQL Server 从 v6.5 开始支持 UNION ALL。如果您还没有这样做,请记住扩展 SQLServerDialect。 因此,这可能是“* 数据类型无法选择为 DISTINCT,因为它不可比较”错误的另一种可能解决方案。

      【讨论】:

        猜你喜欢
        • 2017-08-30
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2014-12-19
        • 1970-01-01
        相关资源
        最近更新 更多