在Spring中建立b/n个实体的一对一关系并存储外键值
To establish one to one relationship b/n entities in Spring and store the foreign key value
我的 mysql 数据库中有两个 table 如下:
CREATE TABLE if not exists USER (
profile_id int(15) NOT NULL AUTO_INCREMENT,
user_id varchar(30) NOT NULL,
password varchar(30) NOT NULL,
first_name varchar(50) NOT NULL,
last_name varchar(50) NOT NULL,
gender char(1) NOT NULL,
nationality varchar(30) NOT NULL,
date_of_birth date NOT NULL,
place_of_birth varchar(30) DEFAULT NULL,
notes tinytext,
PRIMARY KEY (profile_id),
KEY last_name_ind (last_name)
) ENGINE=InnoDB;
CREATE TABLE if not exists USER_CONTACT (
contact_id int(5) NOT NULL AUTO_INCREMENT,
profile_id int(15) NOT NULL,
email_id varchar(30) NOT NULL,
phone_no varchar(15) NOT NULL,
address_current varchar(50) DEFAULT NULL,
address_work varchar(50) DEFAULT NULL,
address_permanent varchar(50) DEFAULT NULL,
alternate_email varchar(30) DEFAULT NULL,
alternate_phone varchar(30) DEFAULT NULL,
PRIMARY KEY (contact_id),
KEY A2B_USER_BASIC_FK (profile_id),
CONSTRAINT A2B_USER_FK FOREIGN KEY (profile_id) REFERENCES a2b_user_basic (profile_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
然后我想使用 JPA 将用户和用户联系方式保存在一起。我面临的问题是将 table 用户的 profile_id 作为外键存储到第二个 table USER_CONTACT
中。此保存应与用户保存一起发生。
这是我的实体 类。
User.java
对应于 user
table,我想使用 JPA 保存 User
。保存用户联系人条目后。
//User.java
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.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name="USER")
public class User extends BaseEntity{
@Column(name="profile_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer profileId;
@Column(name="user_id")
@NotEmpty
protected String userId;
@Column(name="password")
protected String password;
@Column(name="first_name")
@NotEmpty
protected String firstName;
@Column(name="last_name")
@NotEmpty
protected String lastName;
@Column(name="gender")
@NotEmpty
protected String gender;
@Column(name="nationality")
@NotEmpty
protected String nationality;
@Column(name="date_of_birth")
protected Date dateOfBirth;
@Column(name="place_of_birth")
protected String placeOfBirth;
@Column(name="notes")
protected String notes;
@OneToOne(mappedBy="user",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "profile_id")
protected UserContact userContact;
public Integer getProfileId() {
return profileId;
}
public void setProfileId(Integer profileId) {
this.profileId = profileId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getPlaceOfBirth() {
return placeOfBirth;
}
public void setPlaceOfBirth(String placeOfBirth) {
this.placeOfBirth = placeOfBirth;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public UserContact getUserContact() {
return userContact;
}
public void setUserContact(UserContact userContact) {
this.userContact = userContact;
}
}
UserContact.java
对应USER_CONTACT
table和我想建立一对一关系
// UserContact.java
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.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
import com.a2b.trackz.framework.model.BaseEntity;
@Entity
@Table(name="USER_CONTACT")
public class UserContact extends BaseEntity {
@Column(name="contact_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer contactId;
@Column(name="profile_id")
protected Integer profileId;
@Column(name="email_id")
@NotEmpty
protected String emailId;
@Column(name="phone_no")
@NotEmpty
protected String phoneNo;
@Column(name="address_current")
protected String addressCurrent;
@Column(name="address_work")
protected String addressWork;
@Column(name="address_permanent")
protected String addressPermanent;
@Column(name="alternate_email")
protected String alternateEmail;
@Column(name="alternate_phone")
protected String alternatePhone;
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected User user;
public Integer getContactId() {
return contactId;
}
public void setContactId(Integer contactId) {
this.contactId = contactId;
}
public Integer getProfileId() {
return profileId;
}
public void setProfileId(Integer profileId) {
this.profileId = profileId;
}
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getAddressCurrent() {
return addressCurrent;
}
public void setAddressCurrent(String addressCurrent) {
this.addressCurrent = addressCurrent;
}
public String getAddressWork() {
return addressWork;
}
public void setAddressWork(String addressWork) {
this.addressWork = addressWork;
}
public String getAddressPermanent() {
return addressPermanent;
}
public void setAddressPermanent(String addressPermanent) {
this.addressPermanent = addressPermanent;
}
public String getAlternateEmail() {
return alternateEmail;
}
public void setAlternateEmail(String alternateEmail) {
this.alternateEmail = alternateEmail;
}
public String getAlternatePhone() {
return alternatePhone;
}
public void setAlternatePhone(String alternatePhone) {
this.alternatePhone = alternatePhone;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
this.profileId=user.getProfileId();
}
}
更改您的实体 类 参考如下:
User.Java
@OneToOne(mappedBy="user",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected UserContact userContact;
UserContact.java
//remove this
@Column(name="profile_id")
protected Integer profileId;
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected User user;
//add this
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "profile_id", nullable = false)
protected User user;
我的 mysql 数据库中有两个 table 如下:
CREATE TABLE if not exists USER (
profile_id int(15) NOT NULL AUTO_INCREMENT,
user_id varchar(30) NOT NULL,
password varchar(30) NOT NULL,
first_name varchar(50) NOT NULL,
last_name varchar(50) NOT NULL,
gender char(1) NOT NULL,
nationality varchar(30) NOT NULL,
date_of_birth date NOT NULL,
place_of_birth varchar(30) DEFAULT NULL,
notes tinytext,
PRIMARY KEY (profile_id),
KEY last_name_ind (last_name)
) ENGINE=InnoDB;
CREATE TABLE if not exists USER_CONTACT (
contact_id int(5) NOT NULL AUTO_INCREMENT,
profile_id int(15) NOT NULL,
email_id varchar(30) NOT NULL,
phone_no varchar(15) NOT NULL,
address_current varchar(50) DEFAULT NULL,
address_work varchar(50) DEFAULT NULL,
address_permanent varchar(50) DEFAULT NULL,
alternate_email varchar(30) DEFAULT NULL,
alternate_phone varchar(30) DEFAULT NULL,
PRIMARY KEY (contact_id),
KEY A2B_USER_BASIC_FK (profile_id),
CONSTRAINT A2B_USER_FK FOREIGN KEY (profile_id) REFERENCES a2b_user_basic (profile_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
然后我想使用 JPA 将用户和用户联系方式保存在一起。我面临的问题是将 table 用户的 profile_id 作为外键存储到第二个 table USER_CONTACT
中。此保存应与用户保存一起发生。
这是我的实体 类。
User.java
对应于 user
table,我想使用 JPA 保存 User
。保存用户联系人条目后。
//User.java
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.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
@Entity
@Table(name="USER")
public class User extends BaseEntity{
@Column(name="profile_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer profileId;
@Column(name="user_id")
@NotEmpty
protected String userId;
@Column(name="password")
protected String password;
@Column(name="first_name")
@NotEmpty
protected String firstName;
@Column(name="last_name")
@NotEmpty
protected String lastName;
@Column(name="gender")
@NotEmpty
protected String gender;
@Column(name="nationality")
@NotEmpty
protected String nationality;
@Column(name="date_of_birth")
protected Date dateOfBirth;
@Column(name="place_of_birth")
protected String placeOfBirth;
@Column(name="notes")
protected String notes;
@OneToOne(mappedBy="user",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
@JoinColumn(name = "profile_id")
protected UserContact userContact;
public Integer getProfileId() {
return profileId;
}
public void setProfileId(Integer profileId) {
this.profileId = profileId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getNationality() {
return nationality;
}
public void setNationality(String nationality) {
this.nationality = nationality;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getPlaceOfBirth() {
return placeOfBirth;
}
public void setPlaceOfBirth(String placeOfBirth) {
this.placeOfBirth = placeOfBirth;
}
public String getNotes() {
return notes;
}
public void setNotes(String notes) {
this.notes = notes;
}
public UserContact getUserContact() {
return userContact;
}
public void setUserContact(UserContact userContact) {
this.userContact = userContact;
}
}
UserContact.java
对应USER_CONTACT
table和我想建立一对一关系
// UserContact.java
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.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.validator.constraints.NotEmpty;
import com.a2b.trackz.framework.model.BaseEntity;
@Entity
@Table(name="USER_CONTACT")
public class UserContact extends BaseEntity {
@Column(name="contact_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Integer contactId;
@Column(name="profile_id")
protected Integer profileId;
@Column(name="email_id")
@NotEmpty
protected String emailId;
@Column(name="phone_no")
@NotEmpty
protected String phoneNo;
@Column(name="address_current")
protected String addressCurrent;
@Column(name="address_work")
protected String addressWork;
@Column(name="address_permanent")
protected String addressPermanent;
@Column(name="alternate_email")
protected String alternateEmail;
@Column(name="alternate_phone")
protected String alternatePhone;
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected User user;
public Integer getContactId() {
return contactId;
}
public void setContactId(Integer contactId) {
this.contactId = contactId;
}
public Integer getProfileId() {
return profileId;
}
public void setProfileId(Integer profileId) {
this.profileId = profileId;
}
public String getEmailId() {
return emailId;
}
public void setEmailId(String emailId) {
this.emailId = emailId;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getAddressCurrent() {
return addressCurrent;
}
public void setAddressCurrent(String addressCurrent) {
this.addressCurrent = addressCurrent;
}
public String getAddressWork() {
return addressWork;
}
public void setAddressWork(String addressWork) {
this.addressWork = addressWork;
}
public String getAddressPermanent() {
return addressPermanent;
}
public void setAddressPermanent(String addressPermanent) {
this.addressPermanent = addressPermanent;
}
public String getAlternateEmail() {
return alternateEmail;
}
public void setAlternateEmail(String alternateEmail) {
this.alternateEmail = alternateEmail;
}
public String getAlternatePhone() {
return alternatePhone;
}
public void setAlternatePhone(String alternatePhone) {
this.alternatePhone = alternatePhone;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
this.profileId=user.getProfileId();
}
}
更改您的实体 类 参考如下:
User.Java
@OneToOne(mappedBy="user",fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected UserContact userContact;
UserContact.java
//remove this
@Column(name="profile_id")
protected Integer profileId;
@OneToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
protected User user;
//add this
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "profile_id", nullable = false)
protected User user;