1

在 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;
}

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

[1] MSSQL错误代码

4

3 回答 3

1

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;
}
于 2010-08-27T14:44:04.127 回答
1

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

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

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

双向将使用以下表示:

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

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

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

我会试试上面的。

参考

于 2010-08-27T20:21:17.913 回答
0

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

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

于 2012-03-19T13:54:55.610 回答