Java JPA 2.0双向OneTONE不';t在数据库中创建FK列

Java JPA 2.0双向OneTONE不';t在数据库中创建FK列,java,hibernate,jpa,jpa-2.0,Java,Hibernate,Jpa,Jpa 2.0,我有两个非常简单的JPA实体,用于学习目的。现在,我尝试创建一个双向一对一关系,但在DB级别,只创建了Employee端的连接: ID停车空间\u ID 在停车空间一侧,这是创建的 ID 如果这是一个微不足道的问题,我很抱歉,但我真的不知道出了什么问题。我试图在停车位一侧添加目标实体,使关系的两侧都是强制性的。我在其他情况下也使用了这种关系,没有问题。但我想知道这里有什么问题 我使用JPA2.0和Hibernate4.1.7作为提供程序,H2作为底层数据库。一切都在JavaSE环境中运行 @En

我有两个非常简单的JPA实体,用于学习目的。现在,我尝试创建一个双向一对一关系,但在DB级别,只创建了Employee端的连接:

ID停车空间\u ID

停车空间一侧,这是创建的

ID

如果这是一个微不足道的问题,我很抱歉,但我真的不知道出了什么问题。我试图在停车位一侧添加目标实体,使关系的两侧都是强制性的。我在其他情况下也使用了这种关系,没有问题。但我想知道这里有什么问题

我使用JPA2.0和Hibernate4.1.7作为提供程序,H2作为底层数据库。一切都在JavaSE环境中运行

@Entity
public class Employee {
   @Id
   @GeneratedValue
   private int id;

   @OneToOne
   private ParkingSpace parkingSpace;

   //...
}

@Entity
public class ParkingSpace {
    @Id
    @GeneratedValue
    private int id;

   @OneToOne(mappedBy = "parkingSpace")
   private Employee employee; 

   //..
}
persistence.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <persistence version="2.0" 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">
    <persistence-unit name="MenusService" transaction-type="RESOURCE_LOCAL">
        <properties>
            <!-- JPA specific -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost//d:/apps/h2/db/menus;MVCC=TRUE"/>

            <!-- JPA provider specific -->
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      </properties>
</persistence-unit>

控制台中存在一些错误:

错误:未找到表“EMPLOYEE”;SQL语句:

alter table Employee drop constraint FK4AFD4ACE384A747F[42102-168]

在数据库中实现单个关联不需要两个外键。一个就够了

要获取给定员工的停车位,请在停车位表中查找ID等于给定员工ID的行

要为员工提供一个停车位,您需要在employee表中查找
PARKINGSPACE_ID
等于
ID
的行(如果提供了停车位)


如果有两个外键,则停车位可以引用将引用另一个停车位的员工,从而使数据库处于非相干状态。

实现单个关联时,数据库中不需要两个外键。一个就够了

要获取给定员工的停车位,请在停车位表中查找ID等于给定员工ID的行

要为员工提供一个停车位,您需要在employee表中查找
PARKINGSPACE_ID
等于
ID
的行(如果提供了停车位)


如果有两个外键,则停车位可能引用另一个停车位的员工,使数据库处于不连贯状态。

您没有理解JPA中双向的含义

这并不意味着它将在两个表上创建外键,实际上只有一个外键就足以创建联接。 就你而言

SELECT e.* from EMPLOYEE e INNER JOIN PARKINGSPACE p ON e.PARKINGSPACE_ID=p.ID

SELECT p.* from PARKINGSPACE p INNER JOIN EMPLOYEE e ON p.ID=e.PARKINGSPACE_ID
因此,在这种情况下,我们不需要在
PARKINGSPACE
表中使用fk。 JPA中的双向意味着我们在每个实体中都有两个实体的引用,即在获取一个实体时,JPA还可以获取其他关系实体


在您的情况下,在提取员工时,您将自动获取Parkingspace实体,反之亦然,因为您使用的是一对一关系,这在默认情况下是“急切提取”

您没有理解JPA中双向的含义

这并不意味着它将在两个表上创建外键,实际上只有一个外键就足以创建联接。 就你而言

SELECT e.* from EMPLOYEE e INNER JOIN PARKINGSPACE p ON e.PARKINGSPACE_ID=p.ID

SELECT p.* from PARKINGSPACE p INNER JOIN EMPLOYEE e ON p.ID=e.PARKINGSPACE_ID
因此,在这种情况下,我们不需要在
PARKINGSPACE
表中使用fk。 JPA中的双向意味着我们在每个实体中都有两个实体的引用,即在获取一个实体时,JPA还可以获取其他关系实体


在您的情况下,在提取员工时,您将自动获取Parkingspace实体,反之亦然,因为您使用的是一对一关系,这在默认情况下是“急切提取”

你实际上还没有说明问题是什么。你到底在期待什么?对我也是。也创建了从ParkingSpace到Employee的关系。或者我没有抓住要点?我本来希望在ParkingSpace侧创建员工ID,但是……我可能还没有完全醒来。进一步回答JBNizet,您只需要一个FK,这将出现在表中,用于没有mapped by属性的实体。如果要将mappedBy转换为Employee@OneToOne(mappedBy=“Employee”),则会在停车位表中创建一个FK to Employee。@AlanHay,是的,我后来意识到了。谢谢你,你还没有说问题出在哪里。你到底在期待什么?对我也是。也创建了从ParkingSpace到Employee的关系。或者我没有抓住要点?我本来希望在ParkingSpace侧创建员工ID,但是……我可能还没有完全醒来。进一步回答JBNizet,您只需要一个FK,这将出现在表中,用于没有mapped by属性的实体。如果要将mappedBy转换为Employee@OneToOne(mappedBy=“Employee”),则会在停车位表中创建一个FK to Employee。@AlanHay,是的,我后来意识到了。非常感谢。