SURAJ KUMAR
SURAJ KUMAR

Reputation: 57

How to pass data from one html form to multiple tables using spring boot

I have coded three classes (User, UserCredential, Address) where I want to store data into tables using mapping. I am using JSON to store data into tables.

When I store data, data are stored in all tables but in user id it shows 1, in UserCredential id it shows 3 and in Address id it shows 2 while in first entry all id should be 1.

classes are

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

}

i really don't understand how to overcome this problem.

JSON format to store data

{

    "fName":"suresh kumst",
    "lName":"dingh",
    "mobile":4595498366,
    "email":"[email protected]",
    "dob":"2012-04-23T18:25:43.511Z",
    "address":{
        "city":"noida",
        "state":"up",
        "h_no":"123"
    },
    "userCredential":{

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

and the response with different id while they should be 1 in first entry and user id should have value

    {
        "id": 1,
        "fName": "suresh kumst",
        "lName": "dingh",
        "email": "[email protected]",
        "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
        }
    }

Upvotes: 1

Views: 1861

Answers (3)

ash
ash

Reputation: 156

Here, you are using @GeneratedValue(strategy=GenerationType.AUTO). Some DB's will use a common sequence to generate and assign the sequence no's. Hibernate will create a table hibernate_sequence and all the entity tables will refer to this table to get the next sequence no. So, the primary keys will be scattered among the entities. To have the primary key start from 1 for each entity, use @GeneratedValue(strategy=GenerationType.IDENTITY) with each entity.

Upvotes: 1

Kindly use DB sequence so that you have better control of ID generated, Here I'm just sharing sample of one assuming back end DB is Oracle/mysql

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

Here EMP_SN is DB Sequence. Hope this will solve your problem.

Upvotes: 0

Drazen Nikolic
Drazen Nikolic

Reputation: 526

When you use @GeneratedValue(strategy=GenerationType.AUTO) the underlying ORM framework will use either identity column, sequence or table, depending of the underlying DB. In your case, I guess it is using a sequence (a single sequence for generating IDs for all the tables). If that is the case, in order to achieve that each table IDs are independent from other tables, you'll have to give different sequence name to each entity.

If you're using Hibernate, consider using @GenericGenerator. Example from other SO answer:

@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")

Upvotes: 0

Related Questions