У меня есть две сущности 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;
}
}