在 ORACLE 中使用 JPA 的复合 PK 给出 ORA-00904 错误
Composite PK with JPA in ORACLE gives ORA-00904 error
我必须在 Oracle 数据库中使用 JPA 映射复合 PK。
我已经关注了与此相关的其他 SO 问题 tutorial 但我仍然收到以下错误:
java.sql.SQLSyntaxErrorException: ORA-00904: "COMPOSITEI0_"."NAME_1": Invalid Identifier
(其中 NAME_1 与属于 PK 的其中一列的名称相关)
这是我的实体(出于数据保护原因未提及真实姓名):
@Entity
@Table(schema = "SCHEMA", name = "TABLE")
public class CompositeIdEntity {
@Column(name = "NAME1")
private String name1;
@Column(name = "NAME2")
private String name2;
@Column(name = "NAME3")
private String name3;
@EmbeddedId
CompositePrimaryKeyTableEmbeddable id;
public CompositePrimaryKeyTableEmbeddable getId() {
return this.id;
}
public void setId(CompositePrimaryKeyTableEmbeddable id) {
this.id = id;
}
// other getters and setters
我的@Embeddable id class:
@Embeddable
public class CompositePrimaryKeyTableEmbeddable implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name="name1")
private String name1;
@Column(name="name2")
private String name2;
public CompositePrimaryKeyTableEmbeddable() {
super();
}
public CompositePrimaryKeyTableEmbeddable(String name1, String name2) {
this.name1 = name1;
this.name2 = name2;
}
我的@Repository:
@Repository
public interface CompositeIdDao extends JpaRepository<CompositeIdEntity, CompositePrimaryKeyTableEmbeddable> {
}
最后调用数据库,它只有 returns null,因为它只是一个测试,看看它们是否一起工作:
public CompositeIdEto saveCompositeId() {
CompositeIdEntity compositeIdEto = new CompositeIdEntity();
compositeIdEto.setname3("New");
compositeIdEto.setId(new CompositePrimaryKeyTableEmbeddable("ERR", "ER"));
this.compositeIdDao.save(compositeIdEto);
return null;
}
您似乎通过声明一次来复制 name1
和 name2
列
在实体本身和后来的可嵌入中。
您似乎只需要可嵌入的 id 和实体中的 name3
声明:
@Entity
@Table(schema = "SCHEMA", name = "TABLE")
public class CompositeIdEntity {
@EmbeddedId
CompositePrimaryKeyTableEmbeddable id;
@Column(name = "NAME3")
private String name3;
我必须在 Oracle 数据库中使用 JPA 映射复合 PK。
我已经关注了与此相关的其他 SO 问题 tutorial 但我仍然收到以下错误:
java.sql.SQLSyntaxErrorException: ORA-00904: "COMPOSITEI0_"."NAME_1": Invalid Identifier
(其中 NAME_1 与属于 PK 的其中一列的名称相关)
这是我的实体(出于数据保护原因未提及真实姓名):
@Entity
@Table(schema = "SCHEMA", name = "TABLE")
public class CompositeIdEntity {
@Column(name = "NAME1")
private String name1;
@Column(name = "NAME2")
private String name2;
@Column(name = "NAME3")
private String name3;
@EmbeddedId
CompositePrimaryKeyTableEmbeddable id;
public CompositePrimaryKeyTableEmbeddable getId() {
return this.id;
}
public void setId(CompositePrimaryKeyTableEmbeddable id) {
this.id = id;
}
// other getters and setters
我的@Embeddable id class:
@Embeddable
public class CompositePrimaryKeyTableEmbeddable implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
@Column(name="name1")
private String name1;
@Column(name="name2")
private String name2;
public CompositePrimaryKeyTableEmbeddable() {
super();
}
public CompositePrimaryKeyTableEmbeddable(String name1, String name2) {
this.name1 = name1;
this.name2 = name2;
}
我的@Repository:
@Repository
public interface CompositeIdDao extends JpaRepository<CompositeIdEntity, CompositePrimaryKeyTableEmbeddable> {
}
最后调用数据库,它只有 returns null,因为它只是一个测试,看看它们是否一起工作:
public CompositeIdEto saveCompositeId() {
CompositeIdEntity compositeIdEto = new CompositeIdEntity();
compositeIdEto.setname3("New");
compositeIdEto.setId(new CompositePrimaryKeyTableEmbeddable("ERR", "ER"));
this.compositeIdDao.save(compositeIdEto);
return null;
}
您似乎通过声明一次来复制 name1
和 name2
列
在实体本身和后来的可嵌入中。
您似乎只需要可嵌入的 id 和实体中的 name3
声明:
@Entity
@Table(schema = "SCHEMA", name = "TABLE")
public class CompositeIdEntity {
@EmbeddedId
CompositePrimaryKeyTableEmbeddable id;
@Column(name = "NAME3")
private String name3;