Java 休眠一对一关系和外键问题
我有一个奇怪的问题,我找不到。我有两个类,Employee和Address,用于创建具有一对一关系的两个表。 当我检查一个操作的结果时,我看到记录已经添加,但没有外键到表Employee example中的地址:Java 休眠一对一关系和外键问题,java,hibernate,jpa,Java,Hibernate,Jpa,我有一个奇怪的问题,我找不到。我有两个类,Employee和Address,用于创建具有一对一关系的两个表。 当我检查一个操作的结果时,我看到记录已经添加,但没有外键到表Employee example中的地址: 1 John Smith 12333 null 其中null是地址\ u ID。 当我检查地址表时,我看到记录被添加了,但id的开始编号是2 2 New York st. Aperman 234 12 03999 雇员阶级 @Entity p
1 John Smith 12333 null
其中null是地址\ u ID。
当我检查地址表时,我看到记录被添加了,但id的开始编号是2
2 New York st. Aperman 234 12 03999
雇员阶级
@Entity
public class Employee {
@Id
@GeneratedValue
private long id;
private String firstName;
private String lastName;
private double salary;
@OneToOne
@JoinColumn(name = "address_ID")
private Address address;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
地址类
@Entity
public class Address {
@Id
@GeneratedValue
private long id;
public String locality;
public String zipCode;
public String street;
public int streetNumber;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getLocality() {
return locality;
}
public void setLocality(String locality) {
this.locality = locality;
}
public String getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public int getStreetNumber() {
return streetNumber;
}
public void setStreetNumber(int streetNumber) {
this.streetNumber = streetNumber;
}
}
主类
public class Main {
public static void main(String[] args) {
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("tutorialdb");
EntityManager entityManager = entityManagerFactory.createEntityManager();
Employee employee = new Employee();
Address adres = new Address();
employee.setFirstName("John");
employee.setLastName("Smith");
employee.setSalary(12333.0);
adres.setLocality("New York");
adres.setZipCode("03999");
adres.setStreet("st. Aperman 234");
adres.setStreetNumber(12);
entityManager.getTransaction().begin();
entityManager.persist(employee);
entityManager.persist(adres);
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
}
}
persistence.xml
<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="tutorialdb"
transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/tutorial"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>
</persistence-unit>
org.hibernate.ejb.HibernatePersistence
您需要在
员工
中设置地址
引用,然后才能持久化
地址地址=新地址();
...
雇员地址(adres);
Employee表中的外键为
null
,因为在Employee
中没有设置地址,现在确定Employee中的外键为add,但在表address中,当我向空表添加记录时,其id总是以2开头。您知道为什么吗?当您尝试持久化时,会为该事务创建一个id,并且该id不能重复使用。这意味着,如果事务失败,该ID将被忽略。