在Java中使用PostgreSQL Domain和Struct类型

时间:2010-08-15 10:15:22

标签: java postgresql orm jpa eclipselink

创建EntityManagerFactory实例后,收到错误消息:

...
Exception Description: Predeployment of PersistenceUnit [aPU] failed.
Internal Exception: Exception [EclipseLink-7157] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.ValidationException
Exception Description: Entity class [class Table] must use a @JoinColumn instead of @Column to map its relationship attribute [Price].
...

列价是域类型(例如:CREATE TYPE MONEY AS NUMERIC(10,2) FINAL)。

如何使用Domain或Struct PostgreSQL类型?是否可以使用JPA?

1 个答案:

答案 0 :(得分:2)

问题不在于列类型,至少这不是JPA现在抱怨的问题,问题是JPA不知道如何映射Price类型,而不是其中之一基本支持的类型,也不是实体。

  

2.1.1持久字段和属性

     

的持久字段或属性   实体可能具有以下内容   类型:Java原始类型;   java.lang.String;其他Java   可序列化的类型(包括   原始类型的包装器,   java.math.BigInteger,   java.math.BigDecimal,   java.util.Date,   java.util.Calendar,   java.sql.Datejava.sql.Time,   用户定义的java.sql.Timestamp   可序列化类型byte[],   Byte[]char[]Character[];枚举;实体   实体类型的类型和/或集合;和可嵌入的类(见2.1.5节)。

使用标准JPA,尝试使用EmbeddableEmbedded注释:

@Embeddable
public class Price {
    private BigDecimal amount;
    ...
}

然后在您的实体中:

@Embedded
@AttributeOverrides({
    @AttributeOverride(name="amount", column=@Column(name="AMOUNT"))
})
public Price getPrice() { ... }

另一种选择是使用TransformationMapping(特定于EclipseLink)。

参考

  • JPA 1.0规范
    • 2.1.5 Embeddable Classes
    • 2.1.6映射非关系字段或属性的默认值
    • 9.1.34 Embeddable Annotation
    • 9.1.35嵌入式注释