He codificado tres clases (User, UserCredential, Address) donde quiero almacenar datos en tablas usando mapeo. Estoy usando JSON para almacenar datos en tablas.

Cuando almaceno datos, los datos se almacenan en todas las tablas pero en la identificación de usuario muestra 1, en la identificación de credencial de usuario muestra 3 y en la identificación de dirección muestra 2 mientras que en la primera entrada toda la identificación debería ser 1.

Las clases son

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

}

Realmente no entiendo cómo superar este problema.

Formato JSON para almacenar datos

{

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

Y la respuesta con una identificación diferente, mientras que deben ser 1 en la primera entrada y la identificación del usuario debe tener valor

    {
        "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
        }
    }
1
SURAJ KUMAR 10 sep. 2018 a las 14:48

3 respuestas

La mejor respuesta

Aquí, estás utilizando @GeneratedValue(strategy=GenerationType.AUTO). Algunos DB utilizarán una secuencia común para generar y asignar los no de secuencia. Hibernate creará una tabla hibernate_sequence y todas las tablas de entidades se referirán a esta tabla para obtener la siguiente secuencia no. Por lo tanto, las claves principales se distribuirán entre las entidades. Para que la clave primaria comience desde 1 para cada entidad, use @GeneratedValue(strategy=GenerationType.IDENTITY) con cada entidad.

1
Ashish 10 sep. 2018 a las 12:57

Utilice amablemente la secuencia de DB para que tenga un mejor control de la ID generada. Aquí solo comparto una muestra de una asumiendo que la DB de fondo es Oracle/mysql

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

Aquí EMP_SN es la secuencia de DB. Espero que esto resuelva su problema.

0
Joji Thomas Eapen 10 sep. 2018 a las 12:46

Cuando use @GeneratedValue(strategy=GenerationType.AUTO), el marco ORM subyacente usará una columna, secuencia o tabla de identidad, dependiendo de la base de datos subyacente. En su caso, supongo que está usando una secuencia (una única secuencia para generar ID para todas las tablas). Si ese es el caso, para lograr que las ID de cada tabla sean independientes de otras tablas, tendrá que dar un nombre de secuencia diferente a cada entidad.

Si está utilizando Hibernate, considere usar @GenericGenerator. Ejemplo de otro Respuesta 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
Drazen Nikolic 10 sep. 2018 a las 12:19