创建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?
答案 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.Date
,java.sql.Time
, 用户定义的java.sql.Timestamp
可序列化类型byte[]
,Byte[]
,char[]
和Character[]
;枚举;实体 实体类型的类型和/或集合;和可嵌入的类(见2.1.5节)。
使用标准JPA,尝试使用Embeddable
和Embedded
注释:
@Embeddable
public class Price {
private BigDecimal amount;
...
}
然后在您的实体中:
@Embedded
@AttributeOverrides({
@AttributeOverride(name="amount", column=@Column(name="AMOUNT"))
})
public Price getPrice() { ... }
另一种选择是使用TransformationMapping
(特定于EclipseLink)。