在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;
}
有关于此的任何想法吗?我已尝试使用Set
或Document[]
来避免错误。似乎Hibernate总是在我的表上尝试不同的SELECT。我该如何解决这个问题?
答案 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,因为它不具有可比性”错误。