“无法初始化集合”+ @Lob + MSSQL

时间:2010-08-27 13:51:33

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

在n-to-m-relations中使用 Blob -field时 Hibernate MSSQL 由于某种原因失败。

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

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

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

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

双向将使用以下表示形式:

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

在JPA 2.0中,现在可以通过在@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>();
}

我会尝试上面的尝试。

参考

答案 2 :(得分:0)

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

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