1
我有2個類:User
和UserProfile
。休眠單向多對多關係
用戶等級:
public class User implements Serializable{
@Id @GeneratedValue//(strategy=GenerationType.IDENTITY)
private Integer id;
@NotEmpty
@Column(name="SSO_ID", unique=true, nullable=false)
private String ssoId;
@NotEmpty
@Column(name="PASSWORD", nullable=false)
private String password;
@NotEmpty
@Column(name="FIRST_NAME", nullable=false)
private String firstName;
@NotEmpty
@Column(name="LAST_NAME", nullable=false)
private String lastName;
@NotEmpty
@Column(name="EMAIL", nullable=false)
private String email;
@NotEmpty
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "APP_USER_USER_PROFILE",
joinColumns = { @JoinColumn(name = "USER_ID") },
inverseJoinColumns = { @JoinColumn(name = "USER_PROFILE_ID") })
private Set<UserProfile> userProfiles = new HashSet<UserProfile>();
@OneToMany(mappedBy = "sem_creator_id", cascade = CascadeType.ALL)
private Set<Seminar> seminarsTeacher = new HashSet<>();
@OneToMany(mappedBy = "storage_creator_id", cascade = CascadeType.ALL)
private Set<FTPStorage> storageFiles = new HashSet<>();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getSsoId() {
return ssoId;
}
public void setSsoId(String ssoId) {
this.ssoId = ssoId;
}
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Set<UserProfile> getUserProfiles() {
return userProfiles;
}
public void setUserProfiles(Set<UserProfile> userProfiles) {
this.userProfiles = userProfiles;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((ssoId == null) ? 0 : ssoId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof User))
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (ssoId == null) {
if (other.ssoId != null)
return false;
} else if (!ssoId.equals(other.ssoId))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", ssoId=" + ssoId + ", firstName=" + firstName + ", lastName=" + lastName
+ ", email=" + email + "]";
}
public Set<Seminar> getSeminarsTeacher() {
return seminarsTeacher;
}
public void setSeminarsTeacher(Set<Seminar> seminarsTeacher) {
this.seminarsTeacher = seminarsTeacher;
}
public Set<FTPStorage> getStorageFiles() {
return storageFiles;
}
public void setStorageFiles(Set<FTPStorage> storageFiles) {
this.storageFiles = storageFiles;
}
用戶配置文件類:
public class UserProfile implements Serializable{
@Id
@GeneratedValue
private Integer id;
@Column(name="TYPE", length=15, unique=true, nullable=false)
private String type = UserProfileType.USER.getUserProfileType();
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((type == null) ? 0 : type.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof UserProfile))
return false;
UserProfile other = (UserProfile) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
return true;
}
@Override
public String toString() {
return "UserProfile [id=" + id + ", type=" + type + "]";
}
}
當我使用此代碼,我得到了表用戶配置重複實體多對多的關係。我使用persist()
函數作爲保存對象。我究竟做錯了什麼?
然後我刪除cascadeType,我得到錯誤:對象引用一個未保存的瞬態實例 - 在沖洗之前保存瞬態實例。
日誌的Hibernate:
Hibernate:
insert
into
APP_USER
(EMAIL, FIRST_NAME, LAST_NAME, PASSWORD, SSO_ID)
values
(?, ?, ?, ?, ?)
Hibernate:
insert
into
APP_USER_USER_PROFILE
(USER_ID, USER_PROFILE_ID)
values
(?, ?)
Hibernate在用戶配置文件表中創建重複的行,但此表只有唯一的行,我得到錯誤。 –
好吧你是什麼意思,無論如何:private String type = UserProfileType.USER.getUserProfileType(); –
我解決了我的問題。錯誤不在此代碼中。 –