【发布时间】:2014-04-21 07:41:04
【问题描述】:
我无法为我的数据库模型创建 jpa 模型,并且我遇到了主键和外键问题。我正在使用PersistenceContextType.TRANSACTION,当我坚持 foo 对象及其状态时,我收到以下错误:
WARN - SQL Error: 957, SQLState: 42000. ERROR - ORA-00957: duplicate column name.
我正在使用 eclipse JPA 插件来创建我的实体,到目前为止,它一直运行良好。服务器是 JBoss 6.1.0(JPA2.0 和 Hibernate 3.6.6)
我会尽力为你提供所有信息。
这些是实体:
Foo 实体及其 PK。 (我标记了ID_STATE as insertable=false, updatable=false,因为在服务器启动时我收到一个异常,说我必须将它标记为insert="flase" and update="false")
@Entity
@NamedQuery(name = "Foo.findAll", query = "SELECT p FROM Foo p")
public class Foo implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private FooPK id;
public Foo() {
}
public FooPK getId() {
return this.id;
}
public void setId(FooPK id) {
this.id = id;
}
}
@Embeddable
public class FooPK implements Serializable {
private static final long serialVersionUID = 1L;
private long num1;
private long num2;
private long num3;
private long num4;
private long num5;
public FooPK() {
}
public long getNum1() {
return this.num1;
}
public void setNum1(long num1) {
this.num1 = num1;
}
public long getNum2() {
return this.num2;
}
public void setNum2(long num2) {
this.num2 = num2;
}
public long getNum3() {
return this.num3;
}
public void setNum3(long num3) {
this.num3 = num3;
}
public long getNum4() {
return this.num4;
}
public void setNum4(long num4) {
this.num4 = num4;
}
public long getNum5() {
return this.num5;
}
public void setNum5(long num5) {
this.num5 = num5;
}
}
Foo States 实体及其主键对象
@Entity
@Table(name="STATES_FOO")
@NamedQuery(name="StatesFoo.findAll", query="SELECT e FROM StatesFoo e")
public class StatesFoo implements Serializable {
private static final long serialVersionUID = 1L;
@EmbeddedId
private StatesFooPK id;
//bi-directional many-to-one association to State
@ManyToOne
@JoinColumn(name="ID_STATE", insertable=false, updatable=false)
private State state;
//bi-directional many-to-one association to Foo
@ManyToOne
@JoinColumns({
@JoinColumn(name="NUM1", referencedColumnName="NUM1"),
@JoinColumn(name="NUM2", referencedColumnName="NUM2"),
@JoinColumn(name="NUM3", referencedColumnName="NUM3"),
@JoinColumn(name="NUM4", referencedColumnName="NUM4"),
@JoinColumn(name="NUM5", referencedColumnName="NUM5")
})
private Foo foo;
public StatesFoo() {
}
public StatesFooPK getId() {
return this.id;
}
public void setId(StatesFooPK id) {
this.id = id;
}
public Foo getFoo() {
return this.Foo;
}
public void setFoo(Foo foo) {
this.foo = foo;
}
}
@Embeddable
public class StatesFooPK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
@Column(name="ID_STATE", insertable=false, updatable=false)
private String idState;
@Column(name = "TIMESTAMP")
private Timestamp timestamp;
@Column(insertable=false, updatable=false)
private long num1;
@Column(insertable=false, updatable=false)
private long num2;
@Column(insertable=false, updatable=false)
private long num3;
@Column(insertable=false, updatable=false)
private long num4;
@Column(insertable=false, updatable=false)
private long num5;
public EstadosFooPK() {
}
public String getIdState() {
return this.idState;
}
public void setIdState(String idState) {
this.idState = idState;
}
public Timestamp getTimestamp() {
return this.timestamp;
}
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
public long getNum1() {
return this.num1;
}
public void setNum1(long num1) {
this.num1 = num1;
}
public long getNum2() {
return this.num2;
}
public void setNum2(long num2) {
this.num2 = num2;
}
public long getNum3() {
return this.num3;
}
public void setNum3(long num3) {
this.num3 = num3;
}
public long getNum4() {
return this.num4;
}
public void setNum4(long num4) {
this.num4 = num4;
}
public long getNum5() {
return this.num5;
}
public void setNum5(long num5) {
this.num5 = num5;
}
}
表格脚本是:
CREATE TABLE "FOO"
( "NUM1" NUMBER(2,0) NOT NULL ENABLE,
"NUM2" NUMBER(5,0) NOT NULL ENABLE,
"NUM3" NUMBER(4,0) NOT NULL ENABLE,
"NUM4" NUMBER(2,0) NOT NULL ENABLE,
"NUM5" NUMBER(2,0) NOT NULL ENABLE,
CONSTRAINT "FOO_PK" PRIMARY KEY ("NUM1", "NUM2", "NUM3", "NUM4", "NUM5")}
CREATE TABLE "STATES_FOO"
( "NUM1" NUMBER(2,0) NOT NULL ENABLE,
"NUM2" NUMBER(5,0) NOT NULL ENABLE,
"NUM3" NUMBER(4,0) NOT NULL ENABLE,
"NUM4" NUMBER(2,0) NOT NULL ENABLE,
"NUM5" NUMBER(2,0) NOT NULL ENABLE,
"ID_STATE" VARCHAR2(2 CHAR) NOT NULL ENABLE,
"TIMESTAMP" TIMESTAMP (6) NOT NULL ENABLE,
CONSTRAINT "STATES_FOO_PK" PRIMARY KEY ("ID_STATE", "TIMESTAMP", "NUM1", "NUM2", "NUM3", "NUM4", "NUM5"),
CONSTRAINT "STATES_FOO_FOO_FK" FOREIGN KEY ("NUM1", "NUM2", "NUM3", "NUM4", "NUM5")
REFERENCES "FOO" ("NUM1", "NUM2", "NUM3", "NUM4", "NUM5"),
CONSTRAINT "STATES_FOO_STATE_FK" FOREIGN KEY ("ID_STATE")
REFERENCES "STATE" ("ID_STATE"))
【问题讨论】:
-
我在失败了 3 天后发布了这篇文章,但现在我想我找到了解决方案,它是:在 StatesFoo: ` @ManyToOne @MapsId(value="fooId") @JoinColumns (...) private Foo foo;` 和 StatesFooPk: ` @Embeddable 公共类 StatesFooPK 实现 Serializable { @Column(name="ID_STATE", insertable=false, updatable=false) private String idState; @Column(name = "TIMESTAMP") 私有时间戳时间戳; @Embebed 私有 FooPK fooId;`
-
嗨,Podrick 欢迎来到 SO。如果您找到自己问题的答案并使用下面的答案部分分享它是很常见的,因为它是一个有效的答案移动并修复了易读性。谢谢。
-
由于站点限制,我昨天无法回答我自己的问题,但是通过其他方式解决方案根本无法解决问题
标签: java hibernate jpa foreign-keys composite-key