外键列的JPA OneToOne映射约束错误
我曾经尝试过使用教程编写代码。我有一个父类Emp和一个子类EmpAdd。我正在使用持久性将这些类映射到我的表。这些类具有来自我的表Emp和Empadd的实体。在执行CRUD操作时,由于标识符无效,我收到一个ORA-904错误。当我试图向数据库中插入值时,标识符显示了一个额外的列名。 如果我只是插入到父表中,代码就工作了,但是如果我插入到子表中,就会发生此错误 教程来源:外键列的JPA OneToOne映射约束错误,jpa,persistence,jdeveloper,ora-00904,Jpa,Persistence,Jdeveloper,Ora 00904,我曾经尝试过使用教程编写代码。我有一个父类Emp和一个子类EmpAdd。我正在使用持久性将这些类映射到我的表。这些类具有来自我的表Emp和Empadd的实体。在执行CRUD操作时,由于标识符无效,我收到一个ORA-904错误。当我试图向数据库中插入值时,标识符显示了一个额外的列名。 如果我只是插入到父表中,代码就工作了,但是如果我插入到子表中,就会发生此错误 教程来源: 我已经用下面的代码创建了我的表 CREATE TABLE "EMP" ( "EMPID" VARCHAR2(20 BYT
我已经用下面的代码创建了我的表
CREATE TABLE "EMP"
( "EMPID" VARCHAR2(20 BYTE),
"EMPNAME" VARCHAR2(20 BYTE),
PRIMARY KEY ("EMPID");
CREATE TABLE "EMPADD"
( "ADDID" VARCHAR2(20 BYTE),
"HOUSENO" VARCHAR2(20 BYTE),
"ADDLINE1" VARCHAR2(20 BYTE),
"CITY" VARCHAR2(20 BYTE),
"EEID" VARCHAR2(20 BYTE),
PRIMARY KEY ("ADDID"),
FOREIGN KEY ("EEID")
REFERENCES "EMP" ("EMPID") ENABLE
))
生成的insert命令有一个额外的列EMP_EMPID,tht是我的外键。
作为参考,我附上了完整的代码文件
实体Java文件
package project1;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class Emp {
@Id
@GeneratedValue( strategy= GenerationType.AUTO)
private String empid;
private String empname;
public void setEmpid(String empid) {
this.empid = empid;
}
public String getEmpid() {
return empid;
}
public void setEmpname(String empname) {
this.empname = empname;
}
public String getEmpname() {
return empname;
}
public Emp() {
super();
}
@Override
public String toString(){
return " Emp id:"+empid+" Empname:"+empname;
}
}
package project1;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Empadd {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private String addid;
private String houseno;
private String addline1;
private String city;
@OneToOne
private Emp emp;
public Empadd(String addid,String houseno,String addline1,String city){
this.addid=addid;
this.houseno=houseno;
this.addline1=addline1;
this.city=city;
}
public void setAddid(String addid) {
this.addid = addid;
}
public String getAddid() {
return addid;
}
public void setHouseno(String houseno) {
this.houseno = houseno;
}
public String getHouseno() {
return houseno;
}
public void setAddline1(String addline1) {
this.addline1 = addline1;
}
public String getAddline1() {
return addline1;
}
public void setCity(String city) {
this.city = city;
}
public String getCity() {
return city;
}
public void setEmp(Emp emp) {
this.emp = emp;
}
public Emp getEmp() {
return emp;
}
public Empadd() {
super();
}
public String toString(){
return "EmpADD id: "+addid+" houseno: "+houseno+" addline1: "+addline1 +" city: "+city;
}
}
Persistence.xml文件
<?xml version="1.0" encoding="windows-1252" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="link11" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>project1.Emp</class>
<class>project1.Empadd</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="javax.persistence.jdbc.user" value="-------"/>
<property name="javax.persistence.jdbc.password" value="------"/>
</properties>
</persistence-unit>
</persistence>
您需要在@OneToOne上指定联接列。在此字段@JoinColumn(name=“EEID”)上添加进一步的注释。如果没有这一点,您的持久性提供程序将尝试从您的映射推断FK join列。这个问题在您需要在@OneToOne上指定join列时得到了很好的解释。在此字段@JoinColumn(name=“EEID”)上添加进一步的注释。如果没有这一点,持久性提供程序将尝试从映射中推断FK join列
<?xml version="1.0" encoding="windows-1252" ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistence-unit name="link11" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>project1.Emp</class>
<class>project1.Empadd</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="javax.persistence.jdbc.user" value="-------"/>
<property name="javax.persistence.jdbc.password" value="------"/>
</properties>
</persistence-unit>
</persistence>
package project1;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class NewTest {
public static void main(String[] args){
EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "link11" );
EntityManager entitymanager = emfactory.createEntityManager( );
entitymanager.getTransaction( ).begin( );
//Create Employee
Emp emp = new Emp();
emp.setEmpid("00001");
emp.setEmpname("RICK");
//Store Employee
entitymanager.persist(emp);
// Create Emp address
Empadd empadd = new Empadd();
empadd.setAddid("111");
empadd.setHouseno("Street1");
empadd.setAddline1("WORk");
empadd.setCity("BL");
empadd.setEmp(emp); //add emp to empadd
System.out.println(empadd.toString()+emp.toString());
//Store Emp Address
entitymanager.persist(empadd);
entitymanager.getTransaction( ).commit( );
entitymanager.close( );
emfactory.close( );
}
}