一些背景
我有一个游戏数据库,其中包含一个名为Games的表,该表具有多个属性,一个名为Genres。 Genres属性在PostgreSQL中定义为整数[]。为简单起见,我没有使用任何外键约束,但实质上这个数组中的每个整数都是Genres表中id属性的外键约束。第一次使用NetBeans主/明细样本表和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/
//由于用户限制而忽略了超链接
尝试解决方案
如果我将类型的类型更改为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)的UserType文件,但不知道那里出了什么问题。
我也试图使用@OneToMany和其他标签,但这些标签不起作用可能是因为我没有正确使用它们。
我在寻找什么
必须有一种简单的方法来显示这些数据并使其可编辑,但由于我对持久性完全不熟悉,我不知道该怎么做。
答案 0 :(得分:0)
你的问题付出的努力表明。不幸的是,JPA目前不支持PostgreSQL阵列。根本问题是数组不经常在许多其他数据库中频繁使用,因此对它们的严重依赖在某种程度上是PostgreSQL特有的。因此,您可以预期,一般的跨数据库持久性API通常不会很好地支持它们。 JPA也不例外,目前不支持PostgreSQL数组。
我一直在寻找用Java支持数组的自己的持久性API,但它还没有发生,只有在编写时才是PostgreSQL,并且基于与JPA和朋友截然不同的原则。