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;
}
}
Здесь у нас есть пользователь в качестве родительской таблицы, а (учетные данные пользователя и адрес) являются дочерними классами во взаимосвязи. Когда я вставляю данные в таблицы, каждый первичный ключ автоматически увеличивается и получает соответствующее значение, в то время как внешний ключ (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":"[email protected]",
"dob":"2012-04-23T18:25:43.511Z",
"address":{
"city":"noida",
"state":"up",
"h_no":"1243"
},
"userCredential":{
"username":"kr0302",
"password":"12345",
"cnfrmpassword":"12345"
}
}
так что это URL-адрес, а не описание изображения.
1) Как добавить пользователя в сущности Address и UserCredential? - добавьте код, пожалуйста. 2) Попробуйте аннотировать только OneToOne (cascade = CascadeType.ALL). @JsonIgnore, JoinColumn должен находиться преимущественно в аннотациях ManyToOne /. 3) Также вы не можете аннотировать классы Address и UserCredential в классе User, если вы используете логику OneToAone в таблице. (в классах необходим только Пользователь)




Проблема в обратной ссылке. Hibernate не может поддерживать это за вас. Скажем, вы сохранили свой пользовательский объект. он создает строку учетных данных и генерирует идентификатор. он создает адрес и идентификатор. он обновляет cred_id и add_id для объекта пользователя, а затем создает для него строку, генерирует id и возвращает это значение. на этом этапе вам нужно добавить свой пользовательский объект к учетным данным и адресу и снова сохранить их.
Как вы упомянули, я уже добавил объект пользователя в обе таблицы. пожалуйста, посмотрите внимательно и помогите мне выбраться из этого.
см. примечание @ jens-schauder ... отладьте приложение и посмотрите, каковы значения для пользовательского свойства кредитов и адреса. они будут нулевыми ... установите их и снова сохраните .. Добавьте код, в котором вы создаете и сохраняете пользователя.
Кажется, вы пытаетесь смоделировать два двунаправленных отношения:
User <-> UserCredentials и:
User <-> UserAddress.
Но на самом деле вы создаете следующие четыре отношения:
User -> UserCredentials
User <- UserCredentials
User -> UserAddress
User <- UserAddress
Чтобы исправить это, вам нужно использовать mappedBy. См. Этот вопрос для справки.
когда я использую mappedBy, значение usercredential и address показывает null, другими словами, обе таблицы равны null при использовании mappedBy
Обеспечиваете ли вы сохранение обеих сторон отношений в вашей модели?
введите описание изображения здесь <-----