Как решить проблему, когда внешний ключ постоянно равен нулю, когда данные вставляются в таблицы с использованием весенней загрузки? - PullRequest
0 голосов
/ 11 сентября 2018

User.java

package com.spring.demo.model;

import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

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



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

    private String fName;

    private String lName;

    @Column(unique=true,nullable=true)
    private String email;

    @Column(unique=true,nullable=true)
    private long mobile;

    private Date dob;

    @Lob
    private byte[] image;   

    @Transient
    private String base64Image;

    @OneToOne(cascade=CascadeType.ALL,fetch =FetchType.EAGER)
    @JoinColumn(name="userCredential_id")
    private UserCredential userCredential;

    @OneToOne(cascade=CascadeType.ALL,fetch =FetchType.EAGER)
    @JoinColumn(name="add_id")
    private Address address;



    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getfName() {
        return fName;
    }

    public void setfName(String fName) {
        this.fName = fName;
    }

    public String getlName() {
        return lName;
    }

    public void setlName(String lName) {
        this.lName = lName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public long getMobile() {
        return mobile;
    }

    public void setMobile(long mobile) {
        this.mobile = mobile;
    }

    public Date getDob() {
        return dob;
    }

    public void setDob(Date dob) {
        this.dob = dob;
    }

    public byte[] getImage() {
        return image;
    }

    public void setImage(byte[] image) {
        this.image = image;
    }

    public UserCredential getUserCredential() {
        return userCredential;
    }

    public void setUserCredential(UserCredential userCredential) {
        this.userCredential = userCredential;
    }



}

UserCredential.java

package com.spring.demo.model;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
@Table(name="usercredential")
public class UserCredential {

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

    @Column(unique=true,nullable=true)
    private String username;

    private String password;
    private String cnfrmpassword;



    @JsonIgnore
    @OneToOne(cascade=CascadeType.ALL,fetch =FetchType.EAGER)
    @JoinColumn(name="user_id",nullable=true)
    private User user;



    public UserCredential() {
        super();
        // TODO Auto-generated constructor stub
    }


    public UserCredential(int id, String username, String password, String cnfrmpassword, User user) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.cnfrmpassword = cnfrmpassword;
        this.user = user;
    }


    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getCnfrmpassword() {
        return cnfrmpassword;
    }
    public void setCnfrmpassword(String cnfrmpassword) {
        this.cnfrmpassword = cnfrmpassword;
    }

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

}

Address.java

package com.spring.demo.model;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonIgnore;

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

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

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

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

    @Column(name="house_no")
    private String h_no;

    @JsonIgnore
    @OneToOne(cascade=CascadeType.ALL,fetch =FetchType.EAGER)
    @JoinColumn(name="user_id", nullable=true)
    private User user;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getH_no() {
        return h_no;
    }

    public void setH_no(String h_no) {
        this.h_no = h_no;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

Здесь у нас есть пользователь в качестве родительской таблицы, а (usercredential и address) являются дочерними классами в отношениях. Когда я вставляю данные в таблицы, каждый первичный ключ автоматически увеличивается и получает соответствующее значение, а внешний ключ (user_id) всегда остается нулевым. https://i.stack.imgur.com/Pivlm.jpg

https://i.stack.imgur.com/fAPth.jpg

https://i.stack.imgur.com/l37mr.jpg

Меня беспокоит, что user_id (внешний ключ) в дочерних таблицах не должен быть нулевым и равен первичному ключу (user_id) в родительской таблице. Пожалуйста, обратите внимание, что каждая каскадная операция (удаление, обновление) должна быть хорошо реализована в таблице.

Дополнительная информация Я использую Json для вставки данных в таблицы.

{
"fName":"sur kumst",
"lName":"adfdf",
"mobile":45106,
"email":"ksusjasd1sd@gmail.com",
"dob":"2012-04-23T18:25:43.511Z",
"address":{
    "city":"noida",
    "state":"up",
    "h_no":"1243"
},
"userCredential":{

    "username":"kr0302",
    "password":"12345",
    "cnfrmpassword":"12345"
}
}

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Похоже, вы пытаетесь смоделировать два двунаправленных отношения:

User <-> UserCredentials и:

User <-> UserAddress.

Но что вы на самом деле создаете следующие четыре отношения:

User -> UserCredentials

User <- <code>UserCredentials

User -> UserAddress

User <- <code>UserAddress

Чтобы это исправить, вам нужно использовать mappedBy. См. Этот вопрос для справки .

0 голосов
/ 11 сентября 2018

Проблема с обратной ссылкой. Hibernate не может поддерживать это для вас. Скажем, вы сохранили свой пользовательский объект. он создает строку учетных данных и генерирует идентификатор. это создает адрес и идентификатор. он обновляет cred_id и add_id для объекта пользователя, а затем создает для него строку, генерирует id и возвращает это значение. на этом этапе вам нужно добавить свой пользовательский объект в учетные данные и адрес и сохранить их снова.

...