Hibernate / JPA: внешний ключ = ноль - PullRequest
1 голос
/ 16 января 2020

ниже - это мои 2 сущности:

package dev.proj.project.application.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "user")
public class User {

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    public int id;

    @NotNull
    @Column(name="firstname")
    private String firstname;

    @NotNull
    @Column(name="lastname")
    private String lastname;

    @NotNull
    @Column(name="email")
    private String email;

    @NotNull
    @Column(name="password")
    private String password;

    @JsonIgnore
    @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
    private List<Address> address;
}
package dev.proj.project.application.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import java.util.List;

@Getter
@Setter
@NoArgsConstructor
@Entity
@Table(name = "address")
public class Address {

    @Id
    @NotNull
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false, nullable = false)
    private int id;

    @NotNull
    @Column(name="street")
    private String street;

    @NotNull
    @Column(name="house")
    private String house;

    @NotNull
    @Column(name="flat")
    private String flat;

    @NotNull
    @Column(name="code")
    private String code;

    @NotNull
    @Column(name="city")
    private String city;

    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id",nullable = false,updatable = true,insertable = true)
    private User user;

}

Я хочу создать отношение Пользователь-> Адрес Один ко многим, но если я отправил запрос на адрес / адрес:

{"street": "ulicanewnew", "house": "5", "flat": "2", "code": "20-001", "city": "warsaw", "user_id ": 1}

user_id в моей таблице адресов имеет значение null:

enter image description here

Почему внешний ключ в таблице адресов всегда значение NULL? Вы видите, что здесь не так? С прямыми sql вставками в БД - все отлично работает

Ответы [ 3 ]

1 голос
/ 16 января 2020

Я изменил запрос на:

    {
        "street": "dyr",
        "house": "5",
        "flat": "2",
        "code": "20-001",
        "city": "warsaw",
        "user": {
        	"id": 50
        }
    }

и это работает, но пока вопрос: как использовать

"user_id": 50

в моем запросе вместо

"user": {
    "id": 50
}

?

0 голосов
/ 16 января 2020
import java.util.List;
import java.util.Set;
import javax.persistence.*;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotNull;
import org.hibernate.validator.constraints.Length; 

@Entity
@Table(name = "customer")
public class Customer {
     ...
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     @Column(name = "user_id")
     private int id;

     @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
     private List<DatabaseTable> databaseTables;
     ...
}
...
...
import org.hibernate.validator.constraints.Length;
import javax.persistence.*;

@Entity
@Table(name = "databasetable")
public class DatabaseTable {
    ...
    @ManyToOne
    @JoinColumn(name = "user_idFK")
    private Customer customer;
    ....
}

Что-то подобное работает для меня.

0 голосов
/ 16 января 2020

Попробуйте добавить нижеприведенные изменения в свой адресный объект.

@JoinColumn(name = "user_id")
@ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
private User user;
...