Hibernate - Mapping - другой объект с таким же значением идентификатора уже был связан с сеансом - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть две сущности Project и User.Проект имеет 2 поля: владелец и создатель, которые являются объектами пользователя.Эти поля отображаются @OneToOne (cascade = CascadeType.ALL).

Я могу сохранить проект с другим владельцем и создателем.Когда я пытаюсь сохранить объект Project с тем же владельцем и создателем, я получаю следующее сообщение об ошибке:

Другой объект с таким же значением идентификатора уже был связан с сеансом

Причина в том, что Hibernate сохраняет с помощью CascadeType.ALL.Можно ли сохранить этот объект Project с помощью Cascade, когда 2 поля ссылаются на один и тот же объект / строку в таблице?

Объект проекта:

package com.entity;

import java.sql.Timestamp;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="project")
public class Project {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="project_id")
private int projectId;

@Column(name="number")
private int number;

@Column(name="name")
private String name;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="owner_id")
private User owner;

@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="creator_id")
private User creator;

@Column(name="description")
private String description;

@Column(name="start_time")
private Timestamp startTime;

@Column(name="end_time")
private Timestamp endTime;

public Project() {

}

public int getProjectId() {
    return projectId;
}

public void setProjectId(int projectId) {
    this.projectId = projectId;
}

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public User getOwner() {
    return owner;
}

public void setOwner(User owner) {
    this.owner = owner;
}

public User getCreator() {
    return creator;
}

public void setCreator(User creator) {
    this.creator = creator;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public Timestamp getStartTime() {
    return startTime;
}

public void setStartTime(Timestamp startTime) {
    this.startTime = startTime;
}

public Timestamp getEndTime() {
    return endTime;
}

public void setEndTime(Timestamp endTime) {
    this.endTime = endTime;
}

}

Объект пользователя:

package com.entity;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="user")
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name="user_id")
    private int userId;

    @Column(name="role")
    private String role;

    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="user_personal_details_id")
    private UserPersonalDetails userPersonalDetails;

    public User() {

    }

    public User(String role) {
        this.role = role;
    }
    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public UserPersonalDetails getUserPersonalDetails() {
        return userPersonalDetails;
    }

    public void setUserPersonalDetails(UserPersonalDetails userPersonalDetails) {
        this.userPersonalDetails = userPersonalDetails;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }
    @Override
    public String toString() {
        return "User [userId=" + userId + ", role=" + role + ", userPersonalDetails=" + userPersonalDetails + "]";
    }
}

Репозиторий проекта:

package com.repository.impl;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import com.entity.Project;
import com.repository.ProjectRepository;

@Transactional
public class ProjectRepositoryImpl implements ProjectRepository {

    private SessionFactory sessionFactory;

    public ProjectRepositoryImpl(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
    @Override
    public Project saveProject(Project project) {
        Session session = sessionFactory.getCurrentSession();
        session.saveOrUpdate(project);
        return project;
    }

    @Override
    public Project getProject(int projectId) {
        Session session = sessionFactory.getCurrentSession();
        Project project = session.get(Project.class, projectId);
        return project;
    }

    @Override
    public List<Project> getProjects() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int deleteProject(int projectId) {
        Session session = sessionFactory.getCurrentSession();
        Project project = getProject(projectId);
        session.delete(project);
        return projectId;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...