Как отобразить двумерную матрицу в Java в Hibernate / JPA? - PullRequest
9 голосов
/ 04 ноября 2010

У меня есть устаревшая база данных, которую я пытаюсь перестроить в 21 век. Одна из существующих структур данных включает в себя определенный класс, который содержит двумерную матрицу значений. Если бы мне пришлось провести обратный инжиниринг этого класса из базы данных, я бы получил ряд атрибутов, таких как:

private BigDecimal NODE_1_MATRIX_POS_1_1;
private BigDecimal NODE_1_MATRIX_POS_1_2;

и так далее. Поскольку это матрица 6х6, таких столбцов много.

Я искал лучший путь, но я не уверен, что я там. Я хотел бы сделать что-то вроде этого:

@Entity
public class TestClass {

    @Id
    private long id;

    @CollectionOfElements
    @JoinTable(
        name="MATRIX_DATA", 
        joinColumns=@JoinColumn(name="ENTRY_ID"))
    private List<List<BigDecimal>> matrix;

Но это не удалось:

org.hibernate.MappingException: Could not determine type for: java.util.List, at table: MATRIX_DATA, for columns: [org.hibernate.mapping.Column(element)]

Вместо того, чтобы просто пытаться исправить ошибку, я подумал, что я бы поспрашивал и пытался найти правильный подход к решению этой задачи отображения. Кто-нибудь нашел успех и удовлетворение, отображая многомерные массивы через JPA?

1 Ответ

12 голосов
/ 05 ноября 2010

Вместо того, чтобы просто пытаться исправить ошибку, я подумал, что я бы посоветовался и попытался найти правильный подход к решению этой задачи сопоставления.Кто-нибудь нашел успешное и удовлетворяющее отображение многомерных массивов через JPA?

AFAIK, вложенные коллекции не поддерживаются стандартным JPA.В вики-книге по JPA есть хороший раздел на эту тему (я цитирую только ее часть):

Вложенные коллекции, карты и матрицы

В объектной модели довольно распространено иметь сложные отношения коллекции, такие как List из List s (то есть матрица), или Map из Map s, или Map из Listи так далее.К сожалению, эти типы коллекций очень плохо сопоставляются с реляционной базой данных.

JPA не поддерживает отношения вложенных коллекций, и обычно лучше изменить объектную модель, чтобы избежать их, чтобы упростить сохранение и запросы.Одним из решений является создание объекта, который оборачивает вложенную коллекцию.

Например, если Employee имел Map из Project s, с ключом типа проекта String изначение List или Project с.Чтобы отобразить это, можно создать новый класс ProjectType для хранения типа проекта и от OneToMany до Project.

...

И это будетмое предложение.Например:

@Entity
public class TestClass {    
    @Id
    private long id;

    @OneToMany(mappedBy="testClass")
    private List<MatrixRow> matrix;
}

Где будет MatrixLine (без многих деталей):

@Entity
public class MatrixRow {
    @Id
    private long id;

    @ManyToOne
    private TestClass testClass;

    @CollectionOfElements
    private List<BigDecimal> row;
}

Или , возможно Вы можете использовать пользовательский тип пользователя (IЯ не совсем уверен, как это будет работать).

Или (в конце концов, вы уже используете непереносимые аннотации), посмотрите на этот вопрос, чтобы узнать, как вы можете расширить Hibernate:

...