Отображение изменяемых массивов PostgreSQL в основной / подробной форме образца NetBeans с использованием JPA 1.0

#arrays #postgresql #jpa #netbeans

#массивы #postgresql #jpa #netbeans

Вопрос:

Некоторая предыстория

У меня есть база данных игр с таблицей Games, которая имеет несколько атрибутов и один называется Genres. Атрибут Genres определяется как целое число [] в PostgreSQL. Для простоты я не использую никаких ограничений внешнего ключа, но, по сути, каждое целое число в этом массиве является ограничением внешнего ключа для атрибута id в таблице Genres. Впервые работаю с основной / подробной формой образца NetBeans и сохранением Java, и пока все работает отлично, за исключением 1 вещи. Я получаю эту ошибку, когда программа пытается отобразить столбец, содержащий 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).

Вот код, который необходимо каким-то образом изменить. Из игр.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/

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

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

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

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

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

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

Что я ищу

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

Ответ №1:

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

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