外键列的JPA OneToOne映射约束错误

外键列的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

我曾经尝试过使用教程编写代码。我有一个父类Emp和一个子类EmpAdd。我正在使用持久性将这些类映射到我的表。这些类具有来自我的表Emp和Empadd的实体。在执行CRUD操作时,由于标识符无效,我收到一个ORA-904错误。当我试图向数据库中插入值时,标识符显示了一个额外的列名。 如果我只是插入到父表中,代码就工作了,但是如果我插入到子表中,就会发生此错误

教程来源:


我已经用下面的代码创建了我的表

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( );
    }

}