使用JPA 1.0在NetBeans主/明细样本表单中显示可变PostgreSQL数组

时间:2011-11-02 20:59:22

标签: arrays postgresql jpa netbeans

一些背景

我有一个游戏数据库,其中包含一个名为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和其他标签,但这些标签不起作用可能是因为我没有正确使用它们。

我在寻找什么

必须有一种简单的方法来显示这些数据并使其可编辑,但由于我对持久性完全不熟悉,我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

你的问题付出的努力表明。不幸的是,JPA目前不支持PostgreSQL阵列。根本问题是数组不经常在许多其他数据库中频繁使用,因此对它们的严重依赖在某种程度上是PostgreSQL特有的。因此,您可以预期,一般的跨数据库持久性API通常不会很好地支持它们。 JPA也不例外,目前不支持PostgreSQL数组。

我一直在寻找用Java支持数组的自己的持久性API,但它还没有发生,只有在编写时才是PostgreSQL,并且基于与JPA和朋友截然不同的原则。