类型定义在@ManyToOne 关联中不起作用,它具有复合嵌入式主键 JPA 的实体
Type defenition don't work in@ManyToOne association whith entity which have composite embedded primary key JPA
我使用 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;
}
// ...
}
在嵌入式主键中,我定义了数据库类型的列属性类型
columnDefinition @Coloumn 注释的属性:
@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。我的实体与 ManyToOne 关联 CdControl:
@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 最终版。但是应用程序在数据库验证阶段启动时失败。在堆栈跟踪中,我看到下一个异常:
架构验证:在 table [CD_PROPERTY_VALUE] 中的列 [CONTROL_KEY] 中遇到错误的列类型; 找到 [raw (Types#VARBINARY)],但期待 [varchar2(255 char) (Types#VARCHAR)]
关于上面提到的,我有一个问题:我还在哪里指定了 Hibernate 的类型?或者我可能错过了什么?
当所有与 CdControl 关联的类型都指向 RAW 时,它开始工作,而不仅仅是 CdPropertyValue。这种情况下的 Shema-validator 错误消息很混乱。
我使用 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;
}
// ...
}
在嵌入式主键中,我定义了数据库类型的列属性类型 columnDefinition @Coloumn 注释的属性:
@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。我的实体与 ManyToOne 关联 CdControl:
@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 最终版。但是应用程序在数据库验证阶段启动时失败。在堆栈跟踪中,我看到下一个异常:
架构验证:在 table [CD_PROPERTY_VALUE] 中的列 [CONTROL_KEY] 中遇到错误的列类型; 找到 [raw (Types#VARBINARY)],但期待 [varchar2(255 char) (Types#VARCHAR)]
关于上面提到的,我有一个问题:我还在哪里指定了 Hibernate 的类型?或者我可能错过了什么?
当所有与 CdControl 关联的类型都指向 RAW 时,它开始工作,而不仅仅是 CdPropertyValue。这种情况下的 Shema-validator 错误消息很混乱。