Нулевой внешний ключ (Springboot, Hibernate, Postman) - PullRequest
5 голосов
/ 05 августа 2020

Я использую Springboot с Hibernate и хочу сохранить новый «пост», используя POST-запрос к моей базе данных. Одна вещь, которую я хотел бы выделить, это то, что я использую зависимость «spring-boot-starter-data-rest».

Схема базы данных (MySQL): Шма:

Пользователь класса:

@Entity
@Table(name="user")
public class User implements Serializable {

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

    @OneToMany(mappedBy = "user_id_fk")
    public Set<Post> posts;

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

    @Column(name="username")
    private String username;

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

    @Column(name="first_name")
    private String firstName;

    @Column(name="last_name")
    private String lastName;

    @Column(name="create_time")
    protected Date createTime;

    @Column(name="type")
    private String accountType;

    public User() {
        this.createTime = new java.util.Date();
    }

    public User(String email, String username, String password, String firstName, String lastName, Date createTime, String accountType) {
        this.email = email;
        this.username = username;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.createTime = createTime;
        this.accountType = accountType;
        this.createTime = new java.util.Date();
    }

    public User(int id, String email, String username, String password, String firstName, String lastName, Date createTime, String accountType) {
        this.id = id;
        this.email = email;
        this.username = username;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
        this.createTime = createTime;
        this.accountType = accountType;
        this.createTime = new java.util.Date();
    }

Плюс геттеры, сеттеры и toSting ().

Сообщение класса:

@Entity
@Table(name="post")
public class Post implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    public int id;

    @ManyToOne(optional = false)
    @JoinColumn(name = "user_id_fk", nullable = false)
    public User user_id_fk;

    @Column(name="comment")
    private String comment;

    @Column(name="likes")
    private int likes;

    @Column(name="dislike")
    private int dislike;

    @Column(name="create_time")
    protected Date createTime;

    public Post() {
        this.createTime = new java.util.Date();
    }

    public Post(String comment, int likes, int dislike, User user_id_fk) {
        this.user_id_fk = user_id_fk;
        this.comment = comment;
        this.likes = likes;
        this.dislike = dislike;
        this.createTime = new java.util.Date();
    }

    public Post(int id, User user_id_fk, String comment, int likes, int dislike) {
        this.id = id;
        this.user_id_fk = user_id_fk;
        this.comment = comment;
        this.likes = likes;
        this.dislike = dislike;
        this.createTime = new java.util.Date();
    }

Плюс Getters & Setters & toSting ().

Запрос на отправку (я использую Postman для отправки запроса):

{
"comment" : "This is a comment",
"likes" : 123,
"dislike" : 1,
"user_id_fk" :
[
    {
        "id" : 1
    }
]
}

В запросе на "user_id_fk" я пробовал с [ {"id": 1}] и с {"id": 1}, но результат был тем же.

Проблема:

Когда я выполняю точно такой же код с моего контроллера, все работы исключены. Имейте в виду, что я использую зависимость «spring-boot-starter-data-rest». Кроме того, когда я выполняю код без “optional = false” и “nullable = false”, данные вставляются в базу данных, но «user_id_fk» имеет значение null: (.

Ошибка, которую я получаю:

not-null property references a null or transient value : com.citizen.citizen.entity.Post.user_id_fk; 
nested exception is org.hibernate.PropertyValueException: not-null property references a null or transient value : com.citizen.citizen.entity.Post.user_id_fk]

Это означает, что внешний ключ ("user_id_fk") имеет значение NULL, но не должен иметь значение NULL. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Я просто удаляю зависимость "spring-boot-starter-data-rest" и решил проблему, создав свой собственный отдых, и все работает. Целую!

1 голос
/ 05 августа 2020

Согласно этой статье, вы должны сделать user_id_fk обнуляемым, а затем:

  1. Отправить POST для создания пользователя
  2. Отправить второй POST для создания сообщения
  3. Отправьте PUT, чтобы создать связь между ними.

В этой статье говорится то же самое. А в документации упоминается только обработка ассоциаций через ссылки ассоциации.

...