Как исправить ошибку «Другой объект с таким же значением идентификатора уже был связан с сеансом» при использовании отношения «один к одному» - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать взаимно-однозначное отношение между двумя сущностями:

  • Сущность проекта

    @Entity
    @Table(name = "projects")
    public class Project {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @OneToOne(mappedBy = "project", cascade = CascadeType.ALL, optional = false, fetch = FetchType.LAZY)
        private CrawlerConfiguration crawlerConfiguration;
    
        // Getters and setters ...
    
        public void setCrawlerConfiguration(CrawlerConfiguration crawlerConfiguration) {
            if (crawlerConfiguration == null) {
                if (this.crawlerConfiguration != null) {
                    this.crawlerConfiguration.setProject(null);
                }
            } else {
                crawlerConfiguration.setProject(this);
            }
    
            this.crawlerConfiguration = crawlerConfiguration;
        }
    
  • CrawlerConfigurationсущность

    @Entity
    @Table(name = "crawler_configurations")
    public class CrawlerConfiguration {
    
        @Id
        private Long id;
    
        @OneToOne(fetch = FetchType.LAZY)
        @MapsId
        private Project project;
    
        // Getters and setters ...
    }
    

Когда пользователь создает новый проект, для него также должна быть создана конфигурация.

@Transactional
public Project createProject(Project project) {
    project.setCrawlerConfiguration(new CrawlerConfiguration());
    return projectRepository.save(project);
}

К сожалению, это приводит к следующему исключению:

javax.persistence.EntityExistsException: Другой объект с тем же значением идентификатора уже был связан с сеансом: [com.github.peterbencze.serritorcloud.model.entity.CrawlerConfiguration # 1]

Как правильно создать сущности?

1 Ответ

0 голосов
/ 11 октября 2019

Попробуйте это

 @OneToOne(fetch = FetchType.LAZY)
 @PrimaryKeyJoinColumn
 private Project project;

В вашей сущности CrawlerConfiguration

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...