Java JPA 2.0双向OneTONE不';t在数据库中创建FK列
我有两个非常简单的JPA实体,用于学习目的。现在,我尝试创建一个双向一对一关系,但在DB级别,只创建了Employee端的连接: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
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,是的,我后来意识到了。非常感谢。