[英]Hibernate - foreign key null in Address table field
我正在測試一個簡單的代碼來練習 hibernate 實體,它有兩個實體:Employee 和 Address。 一個員工可以有多個地址。 所以它是一個 Employee 是 OneToMany 與 Address 的關系。 Address 與 Employee 是 ManyToOne 關系。
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;
@Entity
@Table(schema = "hibernate_entity_demo", name="employee")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name="first_name")
private String fname;
@Column(name="last_name")
private String lastname;
@Column(name="email")
private String email;
@OneToMany(mappedBy = "employee")
private Set<Address> addressSet;
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", fname='" + fname + '\'' +
", lastname='" + lastname + '\'' +
", email='" + email + '\'' +
", address='" + addressSet+
'}';
}
}
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(schema = "hibernate_entity_demo", name="address")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Address implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "city")
private String city;
@ManyToOne
@JoinColumn(name="employee_id")
private Employee employee;
@Override
public String toString() {
return "Address{" +
"id=" + id +
", city='" + city + '\'' +
", employee='" + employee.getFname() + " "+ employee.getLastname() +
"'}";
}
}
CREATE SCHEMA IF NOT EXISTS hibernate_entity_demo;
CREATE TABLE IF NOT EXISTS hibernate_entity_demo.employee (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
first_name VARCHAR(32) ,
last_name VARCHAR(32) ,
email VARCHAR(32)
);
CREATE TABLE IF NOT EXISTS hibernate_entity_demo.address (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(32),
employee_id INT ,
FOREIGN KEY (employee_id) REFERENCES hibernate_entity_demo.employee(id)
)
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_entity_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
我以為我已經正確設置了所有內容,所以我在創建實體並持久化它們的地方運行了以下代碼:
tx = session.beginTransaction();
Employee emp = Employee.builder()
.fname("John").lastname("Doe").
email("example@gmail.com").build();
Address addr = Address.builder().city("Los Angeles").employee(emp)
.build();
emp.setAddressSet(new HashSet<Address>(Arrays.asList(addr)));
session.persist(addr);
session.persist(emp);
一切都運行良好,但問題來了。 Address表中的employee_id字段是null,這是我直接看我的數據庫得到的。
ID | 名 | 姓 | |
---|---|---|---|
1個 | 例子@gmail.com | 約翰 | 母鹿 |
ID | 城市 | 員工ID |
---|---|---|
1個 | 洛杉磯 |
我希望我的表看起來像這樣,而不是 id 為 1 的地址的 employee_id 為 1。
ID | 名 | 姓 | |
---|---|---|---|
1個 | 例子@gmail.com | 約翰 | 母鹿 |
ID | 城市 | 員工ID |
---|---|---|
1個 | 洛杉磯 | 1個 |
我試過將hbm2ddl.auto
更改為update
,但沒有用。 我還嘗試運行以下代碼以查看地址的員工是否正確。
Employee e1 = session.get(Employee.class,1);
Address a1 = session.get(Address.class, 1);
System.out.println(e1);
System.out.println(a1);
output 是:
Employee{id=1, fname='John', lastname='Doe', email='example@gmail.com', address='[Address{id=1, city='Los Angeles', employee='John Doe'}]}
Address{id=1, city='Los Angeles', employee='John Doe'}
如您所見,當我打印出來時, Address a1
具有正確的Employee e1
,但外鍵仍然不在表中。
有什么建議嗎?
好的固定。 需要在 Address 之前保留 Employee。 正確的順序應該在下面。
session.persist(emp);
session.persist(addr);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.