Как передать данные из одной HTML-формы в несколько таблиц с помощью весенней загрузки - PullRequest
0 голосов
/ 10 сентября 2018

Я кодировал три класса (User, UserCredential, Address), где я хочу хранить данные в таблицах, используя сопоставление. Я использую JSON для хранения данных в таблицах.

Когда я сохраняю данные, данные хранятся во всех таблицах, но в идентификаторе пользователя отображается 1, в идентификаторе UserCredential - 3, в идентификаторе адреса - 2, тогда как в первой записи все идентификаторы должны быть 1.

классы

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
    @Column(name="user_id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    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.userCreenter code heredential = 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
public class UserCredential {

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

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

    private String password;
    private String cnfrmpassword;



    @JsonIgnore
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="user_id")
    private 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.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

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

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @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;

    @ManyToOne
    @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;
    }

}

Я действительно не понимаю, как преодолеть эту проблему.

JSON формат для хранения данных

{

    "fName":"suresh kumst",
    "lName":"dingh",
    "mobile":4595498366,
    "email":"ksuraj1sd00@gmail.com",
    "dob":"2012-04-23T18:25:43.511Z",
    "address":{
        "city":"noida",
        "state":"up",
        "h_no":"123"
    },
    "userCredential":{

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

и ответ с другим идентификатором, в то время как они должны быть 1 в первой записи, а идентификатор пользователя должен иметь значение

    {
        "id": 1,
        "fName": "suresh kumst",
        "lName": "dingh",
        "email": "ksuraj1sd00@gmail.com",
        "mobile": 4595498366,
        "dob": "2012-04-23T18:25:43.511+0000",
        "image": null,
        "userCredential": {
            "id": 3,
            "username": "ksuraj1asd002",
            "password": "12345",
            "cnfrmpassword": "12345"
        },
        "address": {
            "id": 2,
            "city": "noida",
            "state": "up",
            "h_no": "123",
            "user": null
        }
    }

Ответы [ 3 ]

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

При использовании @GeneratedValue(strategy=GenerationType.AUTO) базовая структура ORM будет использовать либо столбец идентификатора, последовательность или таблицу, в зависимости от базовой БД. В вашем случае, я предполагаю, что он использует последовательность (одну последовательность для генерации идентификаторов для всех таблиц). Если это так, чтобы добиться того, чтобы идентификаторы каждой таблицы были независимы от других таблиц, вам нужно будет присвоить разные имена последовательностей каждой сущности.

Если вы используете Hibernate, рассмотрите возможность использования @GenericGenerator. Пример из другого SO ответа :

@GenericGenerator(
    name = "wikiSequenceGenerator",
    strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
    parameters = {
            @Parameter(name = "sequence_name", value = "WIKI_SEQUENCE"),
            @Parameter(name = "initial_value", value = "1000"),
            @Parameter(name = "increment_size", value = "1")
    }
)
@Id
@GeneratedValue(generator = "wikiSequenceGenerator")
0 голосов
/ 10 сентября 2018

Здесь вы используете @GeneratedValue(strategy=GenerationType.AUTO). Некоторые БД будут использовать общую последовательность для генерации и назначения последовательности №. Hibernate создаст таблицу hibernate_sequence, и все таблицы сущностей будут обращаться к этой таблице, чтобы получить следующий номер последовательности. Итак, первичные ключи будут разбросаны по сущностям. Чтобы первичный ключ начинался с 1 для каждого объекта, используйте @GeneratedValue(strategy=GenerationType.IDENTITY) для каждого объекта.

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

Пожалуйста, используйте последовательность БД, чтобы вы могли лучше контролировать сгенерированный идентификатор. Здесь я просто делюсь примером того, что внутренняя БД имеет значение Oracle/mysql

 @Id
   @GeneratedValue(strategy=GenerationType.AUTO, generator = "employee_sequence")
   @SequenceGenerator(name = "employee_sequence", sequenceName = "EMP_SN")
    private Long empNo;

Здесь EMP_SN - последовательность БД. Надеюсь, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...