当前位置: 首页 > 知识库问答 >
问题:

Hibernate单向多对多关系

姚煜
2023-03-14

我有两个类:< code>User和< code>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
    (?, ?)

共有1个答案

甘君之
2023-03-14

将其添加到您的条件代码中

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

当您使用条件提取时。这将删除重复的行。

希望,这会有帮助

 类似资料:
  • 假设我们有两个实体,Entity和Entity。有多个s。节点可以属于多个集群。因此,在

  • 1. 前言 通过本节课程的学习,你将发现关联对象之间的微妙关系。相信这种关系对你更深入地认识 HIbernate 有很大的帮助。 通过本节课程,你将了解到: 多对多双向关联映射中哪一方是关系维系者; 级联操作与关系维系者。 2. 关系维系者 新学期开始了,同学们选择了各自喜欢的课程,现在为学生添加选修课程的任务就要落在 Hibernate 的身上。一起来看看 Hibernate 是如何完成这个任务

  • 我试图使用Hibernate标准来选择,使用多对多关系中相关的表。n-m表有一些附加列,而不仅仅是每个表的ID。 java.lang.IllegalArgumentException:无法在此ManagedType[User]上找到具有给定名称[UserRolesList.Role]的属性 我已经为这种情况尝试了许多选择,比如加入,但仍然无法使其工作。

  • 我在hibernate中搜索建立关系的各种可能性,遇到了下面的代码片段

  • 1. 前言 本节课程和大家一起聊聊一对多关联映射。通过本节课程,你将了解到: 如何实现一对多关联映射; 如何实现双向一对多关联映射; 关联映射中的级联操作。 2. 一对多关联映射 关系型数据库中表与表中的数据存在一对多(或多对一)关系。 如学生表、班级表。一个班级有多个学生,多个学生可以在同一个班级。 一对多或多对一本质上是一样的,如同一块硬币的正面和反面,只是看待事物的角度不同而已。 数据库中有

  • 问题内容: 我有实体类A和C。它们正在映射表tblA和tblC,并且它们之间具有多对多关系,而tblB可以在它们之间进行映射。tblB包含A_ID,C_ID和SetDate,最后一个是它的设置日期,因此是关系的属性。我的问题是,如何最好地映射此属性?目前,它们尚未映射,如下所示: A: C: 我应该如何从中获取tblB.SetDate? 干杯 问题答案: 据我所知, 不可能 以这种方式映射它,您必