Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenJPA:如何使用枚举持久化实体?_Java_Postgresql_Jpa_Enums_Openjpa - Fatal编程技术网

Java OpenJPA:如何使用枚举持久化实体?

Java OpenJPA:如何使用枚举持久化实体?,java,postgresql,jpa,enums,openjpa,Java,Postgresql,Jpa,Enums,Openjpa,我有一个实体 @Entity @Table(name = "product") public class Product { @Id private Long id; @Column(name = "name") private String name; @Column(name = "condition") @Enumerated(value = EnumType.STRING) private Condition conditio

我有一个实体

@Entity
@Table(name = "product")
public class Product {

    @Id
    private Long id;

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

    @Column(name = "condition")
    @Enumerated(value = EnumType.STRING)
    private Condition condition;

    public enum Condition {
        NEW, USED
    }
    // default constructor and getters/setters omitted
}
Product product = new Product();
product.setItemName("Gloves");
product.setCondition(Product.Condition.NEW);

entityManager.getTransaction().begin();
entityManager.persist(product);
entityManager.getTransaction().commit();
entityManager.close();
以及持久化实体的Java代码

@Entity
@Table(name = "product")
public class Product {

    @Id
    private Long id;

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

    @Column(name = "condition")
    @Enumerated(value = EnumType.STRING)
    private Condition condition;

    public enum Condition {
        NEW, USED
    }
    // default constructor and getters/setters omitted
}
Product product = new Product();
product.setItemName("Gloves");
product.setCondition(Product.Condition.NEW);

entityManager.getTransaction().begin();
entityManager.persist(product);
entityManager.getTransaction().commit();
entityManager.close();
这是我的PostgreSQL数据库

枚举类型

CREATE TYPE product_condition AS ENUM ('NEW', 'USED');
还有桌子

CREATE TABLE product (
id     SERIAL            NOT NULL,
name   VARCHAR(255)      NOT NULL,
condition product_condition NOT NULL,
CONSTRAINT product_pk PRIMARY KEY (id)
);
但无法将新产品插入数据库,因为

Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: ERROR: column "condition" is of type product_condition but expression is of type character varying
  Hint: You will need to rewrite or cast the expression.
  Position: 55 {prepstmnt 1419086773 INSERT INTO product (id, condition, name) VALUES (?, ?, ?)} [code=0, state=42804]

如何修复它?

执行枚举定义枚举条件{NEW(“NEW”)、USED(“USED”)}帮助,这是一个疯狂的想法,但请尝试一下。谁知道OpenJPA是如何转换自定义sql枚举列类型的呢。最后一种方法是ofc使用varchar sql列,但我猜您想避免它。或者这个答案对您有效?不幸的是,它对我不起作用。既然您告诉它作为字符串持久化,那么它就希望这样做,但您的DB有一个特定于RDBMS的枚举类型的列。。。也许OpenJPA不支持这一点,它的文档怎么说?我没有发现任何关于这一点的提及。所以是的,也许它不支持这样的东西。