【发布时间】:2017-09-17 11:18:09
【问题描述】:
我使用 JPA 接口,提供程序 - Hibernate。一个实体嵌入了主键:
@Entity
@Table(name = "CD_CONTROL")
public class CdControl extends BaseDAO<CdControl> {
@EmbeddedId
private CdControlPk id;
@Column(name = "CD_CONTROL_NAME")
private String cdControlName;
// ...
public CdControlPk getId() {
return id;
}
public void setId(CdControlPk id) {
this.id = id;
}
// ...
}
在嵌入的主键中,我定义了数据库类型的列类型的属性 @Coloumn 注释的columnDefinition 属性:
@Embeddable
public class CdControlPk implements Serializable {
@Column(name="CONTROL_KEY", columnDefinition = "RAW")
private String controlKey;
@Column(name="CONTROL_OWNER_KEY", columnDefinition = "RAW")
private String controlOwnerKey;
// ...
}
在数据库关联列中有类型 RAW。它使用了数据库 Oracle 10g。我有与 CdControl 有 ManyToOne 关联的实体:
@Entity
@Table(name="CD_PROPERTY_VALUE")
public class CdPropertyValue extends BaseDAO<CdPropertyValue> implements Serializable {
@EmbeddedId
private CdPropertyValuePK id;
@Column(name="VALUE")
private String value;
//bi-directional many-to-one association to CdControl
@ManyToOne
@MapsId("id")
@JoinColumns({
@JoinColumn(name = "CONTROL_OWNER_KEY", referencedColumnName ="CONTROL_OWNER_KEY",
columnDefinition="RAW", insertable=false,updatable=false),
@JoinColumn(name = "CONTROL_KEY", referencedColumnName = "CONTROL_KEY",
columnDefinition="RAW", insertable=false,updatable=false )
})
private CdControl cdControl;
// ...
}
这里我还明确指出 RAW 输入 @JoinColoumn。在 EntityManagerProperties hibernate.hbm2ddl.auto = validate。休眠版本 - 5.1.1 最终版。但是应用程序在数据库验证阶段启动时失败。在堆栈跟踪中,我看到了下一个异常:
架构验证:在表 [CD_PROPERTY_VALUE] 的列 [CONTROL_KEY] 中遇到错误的列类型; 找到 [raw (Types#VARBINARY)],但期待 [varchar2(255 char) (Types#VARCHAR)]
关于提到的,我有一个问题:我在哪里指定类型来休眠?或者我可能错过了什么?
【问题讨论】:
标签: hibernate jpa primary-key many-to-one