"не удалось инициализировать коллекцию" + @Lob + MSSQL - PullRequest
1 голос
/ 27 августа 2010

При использовании полей Blob в отношениях n-to-m 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 на моих столах. Как я могу обойти это?

[1] Коды ошибок MSSQL

Ответы [ 3 ]

1 голос
/ 28 августа 2010

Было бы интересно опубликовать выполненные запросы и таблицы. Но я могу подумать об одном различии между этими двумя сопоставлениями (однонаправленное соотношение один-ко-многим и двунаправленное) в том, как они представлены на уровне базы данных.

По умолчанию однонаправленный один-ко-многим будет использовать таблицу соединения:

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

В то время как двунаправленный 1009 * будет использовать следующее представление:

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>();
}

Я бы попробовал вышеупомянутое.

Ссылки

1 голос
/ 27 августа 2010

Мне удалось решить проблему, добавив обратную ссылку в мой класс 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;
}
0 голосов
/ 19 марта 2012

Я исправил это по-другому. У меня уже было mappedBy = "enrollment" на моем OneToMay, а на моем ManyToOne у меня было @JoinColumn(name="enrollment", nullable=true). Так что это не было вопросом отношений.

Вместо этого я нашел сообщение на спящем форуме, предлагающее переопределить supportsUnionAll() из класса Диалект. По умолчанию возвращается false, но SQL Server с версии v6.5 поддерживает UNION ALL. Запомните расширение SQLServerDialect, если вы еще этого не сделали. Так что это может быть другим возможным решением для ошибки «Тип данных * не может быть выбран как DISTINCT, потому что он несопоставим».

...