2017-04-23 140 views
1

我有2個類:UserUserProfile休眠單向多對多關係

用戶等級:

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 
    (?, ?) 

回答

0

這個當您使用提取標準添加到您的criteria代碼

return session.createCriteria(User.class) 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list(); 

。這將刪除重複的行。

希望,這將有助於

+0

Hibernate在用戶配置文件表中創建重複的行,但此表只有唯一的行,我得到錯誤。 –

+0

好吧你是什麼意思,無論如何:private String type = UserProfileType.USER.getUserProfileType(); –

+0

我解決了我的問題。錯誤不在此代碼中。 –