我有两个非常简单的 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/