簡體   English   中英

Hibernate - 地址表字段中的外鍵 null

[英]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)
)

我的 hibernate.cfg.xml

<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 email
1個 例子@gmail.com 約翰 母鹿
地址表
ID 城市 員工ID
1個 洛杉磯

我期待什么

我希望我的表看起來像這樣,而不是 id 為 1 的地址的 employee_id 為 1。

員工表
ID email
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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM