#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.