java - JPA 2.0 双向 OneToOne 不在数据库中创建 FK 列

标签 java hibernate jpa jpa-2.0

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

ID PARKINGSPACE_ID

PARKINGSPACE 端,这是创建的内容

ID

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

我使用 JPA 2.0 和 hibernate 4.1.7 作为提供者,H2 作为底层数据库。一切都在 Java SE 环境中运行。

@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”;语句: alter table Employee 删除约束 FK4AFD4ACE384A747F [42102-168]

最佳答案

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

要获得给定员工的 parking 位,您需要在 parking 位表中查找 ID 等于给定员工的 PARKINGSPACE_ID 的行。

要让员工获得 parking 位,您可以在员工表中查找 PARKINGSPACE_ID 等于给定 parking 位的 ID 的行。

如果有两个外键, parking 位可以引用一个员工,该员工将引用另一个 parking 位,从而使数据库处于不连贯的状态。

关于java - JPA 2.0 双向 OneToOne 不在数据库中创建 FK 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20116843/

相关文章:

Java学习数组的问题

java - 在android中创建软键盘时出错

java - hibernate : unable to map mapping document as they are already available in

java - 将一对 @ManyToOne 相关属性标记为唯一。可能的?

java - 使用 Jersey RxJava 客户端未找到类 rx.Observable 的序列化器

java - 找不到局部变量 'ac'

sql - JPA 或数据库架构中的外键级联

java - Hibernate - 在三列中,至少一列必须为非空

jpa - 改进 JPA 多态关联的设计

sql - 具有复合主键查询的 JPA COUNT 不起作用