Отображение изменяемых массивов PostgreSQL в образце формы Master / Detail NetBeans с использованием JPA 1.0 - PullRequest
2 голосов
/ 03 ноября 2011

Немного предыстории

У меня есть игровая база данных с таблицей под названием Игры, которая имеет несколько атрибутов, и одна с именем Жанры.Атрибут Genres определяется как целое число [] в PostgreSQL.Для простоты я не использую никаких ограничений внешнего ключа, но по существу каждое целое число в этом массиве является ограничением внешнего ключа для атрибута id в таблице Genres.Первый раз работал с образцом формы NetBeans Master / Detail и с сохранением Java, и до сих пор он работал отлично, за исключением одной вещи.Я получаю эту ошибку, когда программа пытается отобразить столбец с 1-мерным целочисленным массивом.В этом примере значение равно {1, 11}.

Exception Description: The object [{1,11}], of class [class org.postgresql.jdbc3.Jdbc3Array], from mapping [oracle.toplink.essentials.mappings.DirectToFieldMapping[genres-->final.public.games.genres]] with descriptor [RelationalDescriptor(finalproject.Games --> [DatabaseTable(final.public.games)])], could not be converted to [class [B].
Exception [TOPLINK-3002] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ConversionException

Мои исследования

Из того, что я смог прочитать, похоже, что PostgreSQLмассивам нужно сделать что-то особенное, прежде чем вы сможете отображать и редактировать их в этом шаблоне.По умолчанию образец формы использует TopLink Essentials (JPA 1.0) в качестве библиотеки постоянства, но я также могу использовать Hibernate (JPA 1.0).

Вот код, который необходимо каким-то образом изменить.Из файла Games.java:

@Entity
@Table(name = "games", catalog = "final", schema = "public")
@NamedQueries({
// omitting named queries
@NamedQuery(name = "Games.findByGenres", query = "SELECT g FROM Games g WHERE g.genres = :genres")
})

public class Games implements Serializable {
    @Transient
    private PropertyChangeSupport changeSupport = new PropertyChangeSupport(this);
    private static final long serialVersionUID = 1L;

    // omitting other attributes

    @Column(name = "genres")
    private Serializable genres;

    // omitting constructors and other getters/setters

    public Serializable getGenres() {
        return genres;
    }

    public void setGenres(Serializable genres) {
        Serializable oldGenres = this.genres;
        this.genres = genres;
        changeSupport.firePropertyChange("genres", oldGenres, genres);
    }
} // end class Games

Вот также некоторые сайты, которые могут иметь решение, которое я просто не понимаю: https://forum.hibernate.org/viewtopic.php?t=946973

http://blog.xebia.com/2009/11/09/understanding-and-writing-hibernate-user-types/

// пропущена гиперссылка из-за ограничений пользователя

Попытки решения

Я могу получить данные для отображения, если изменить тип жанра наСтрока, но она неизменна, и я не могу ее редактировать.Вот что я изменил, чтобы сделать это:

    @Column(name = "genres")
    private String genres;

    public String getGenres() {
        return genres;
    }

    public void setGenres(String genres) {
        String oldGenres = this.genres;
        this.genres = genres;
        changeSupport.firePropertyChange("genres", oldGenres, genres);
    }

Я также попытался создать файл UserType для использования с Hibernate (JPA 1.0), но не знал, что там происходит.

Я также пытался использовать @OneToMany и другие теги, но они не работают, вероятно, потому что я их не правильно использую.

Что я ищу

Должен быть простой способ отобразить эти данные и сделать их редактируемыми, но, поскольку я абсолютно новичок в постоянстве, я понятия не имею, что делать.

1 Ответ

0 голосов
/ 22 марта 2013

Усилия, вложенные в ваш вопрос, показывают.К сожалению, JPA в настоящее время не поддерживает массивы PostgreSQL.Основная проблема заключается в том, что массивы не часто используются во многих других базах данных, и поэтому их сильная зависимость отчасти зависит от PostgreSQL.Таким образом, вы можете ожидать, что общие кросс-дБ API-интерфейсы персистентности вообще не будут хорошо поддерживать их, если они вообще будут.JPA не является исключением, поскольку в настоящее время не поддерживает массивы PostgreSQL.

Я пытался написать свой собственный API персистентности в Java, который бы поддерживал массивы, но это еще не произошло, будет только для PostgreSQL, когданаписано, и будет основано на совершенно другом принципе, чем JPA и друзья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...