1

私はこの状況を持っています:

@Entity
@Table(name = "project_leader")
public class ProjectLeader {

@ManyToOne
@JoinColumn(name = "projectId")
@JsonBackReference(value = "project")
private Project project;

...

および関連エンティティ

@Entity
@Table(name = "project")
public class Project {

@OneToMany(fetch = FetchType.EAGER, mappedBy = "project", orphanRemoval = true)
@Cascade(CascadeType.ALL)
@JsonManagedReference(value = "project")
private Set<ProjectLeader> projectLeaders = new HashSet<ProjectLeader>();

たとえば状況で

Project_A と ProjectLeader_1 および Project_B と ProjectLeader_2

ProjectLeader_1 を Project_B に追加しようとすると、ProjectLeader_1 が Project_A から Project_B に完全に移動されるため、次のような状況になります。

Project_A with -No Leader- and Project_B with ProjectLeader_2 ProjectLeader_1

望ましい結果は次のようになります。

Project_A と ProjectLeader_1 および Project_B と ProjectLeader_2 ProjectLeader_1

プロジェクトにリーダーを割り当てる方法は次のとおりです。

private Project initializeProject(@Nonnull ProjectDto projectDto) {
        Project project = null;
        if (projectDto.getId() != null) {
            project = projectRepository.findOne(projectDto.getId());
        } else {
            project = new Project();
        }
        project.setName(projectDto.getName());
        project.setProjectType(projectDto.getProjectType());
        project.setFinancedBy(projectDto.getFinancedBy());

        Set<ProjectLeader> projectLeaders = new HashSet<ProjectLeader>();

        for (ProjectLeaderDto projectLeaderDto : projectDto.getProjectLeaderDtos()) {
            ProjectLeader projectLeader = new ProjectLeader();
            Professor professor = null;
            if (projectLeaderDto.getId() != null && projectLeaderDto.getId() > 0L) {
                projectLeader = projectLeaderRepository.findOne(projectLeaderDto.getId());
            }
            if (projectLeaderDto.getProfessorId() != null && projectLeaderDto.getProfessorId() > 0L) {
                professor = professorRepository.findOne(projectLeaderDto.getProfessorId());
            }
            projectLeader.setName(projectLeaderDto.getName());
            projectLeader.setSurname(projectLeaderDto.getSurname());
            projectLeader.setProject(project);
            projectLeader.setProfessor(professor);

            projectLeaders.add(projectLeader);
        }
        // If collection from Dto miss some element from original collection, we
        // remove it from original
        Iterator<ProjectLeader> currentLeadersIterator = project.getProjectLeaders().iterator();
        while (currentLeadersIterator.hasNext()) {
            ProjectLeader projectLeader = currentLeadersIterator.next();
            if (!projectLeaders.contains(projectLeader)) {
                currentLeadersIterator.remove();
                projectLeader.setProject(null);
            }
        }
        // If original collection miss some element from Dto collection, we add
        // it to original
        Iterator<ProjectLeader> newLeadersIterator = projectLeaders.iterator();
        while (newLeadersIterator.hasNext()) {
            ProjectLeader projectLeader = newLeadersIterator.next();
            if (!project.getProjectLeaders().contains(projectLeader)) {
                project.getProjectLeaders().add(projectLeader);
                projectLeader.setProject(project);
            }
        }

        return project;
    }

これの潜在的な理由は何ですか?

私はここに新しいので、他の場所に同様の質問がある場合はリンクを投稿してください。ありがとうございました。

4

1 に答える 1

1

挿入に問題があると思います。各プロジェクトには 1 人のプロジェクト リーダーがいることに注意してください。別のリーダーをプロジェクトに配置すると、古いリーダーが削除され、新しいリーダーが挿入されます。問題について小さなプログラムを書きました。

package leader;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the Project database table.
* 
*/
@Entity
@NamedQuery(name="Project.findAll", query="SELECT p FROM Project p")
public class Project implements Serializable {
private static final long serialVersionUID = 1L;

@Id
private int id;

//bi-directional many-to-one association to ProjectLeader
@ManyToOne
@JoinColumn(name="Leader_Id")
private ProjectLeader projectLeader;

public Project() {
}

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}

public ProjectLeader getProjectLeader() {
    return this.projectLeader;
}

public void setProjectLeader(ProjectLeader projectLeader) {
    this.projectLeader = projectLeader;
}

}

ProjectLeader クラス:

package leader;

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;



@Entity
@NamedQuery(name="ProjectLeader.findAll", query="SELECT p FROM ProjectLeader p")
 public class ProjectLeader implements Serializable {
 private static final long serialVersionUID = 1L;

@Id
private int id;

//bi-directional many-to-one association to Project
@OneToMany(mappedBy="projectLeader",fetch=FetchType.EAGER,orphanRemoval=true)
private List<Project> projects;

public ProjectLeader() {
}

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}

public List<Project> getProjects() {
    return this.projects;
}

public void setProjects(List<Project> projects) {
    this.projects = projects;
}

public Project addProject(Project project) {
    getProjects().add(project);
    project.setProjectLeader(this);

    return project;
}

public Project removeProject(Project project) {
    getProjects().remove(project);
    project.setProjectLeader(null);

    return project;
}

}

およびテストクラス

package leader;

 import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceUnit;

public class Test {

@PersistenceUnit(unitName="leader")
EntityManagerFactory emf1;


  public static void main(String[] args) {
    Project projectA = new Project();
    projectA.setId(1);


    Project projectB = new Project();
    projectB.setId(2);


    ProjectLeader leaderA = new ProjectLeader();
    leaderA.setId(1);

    ProjectLeader leaderB = new ProjectLeader();
    leaderB.setId(2);



    EntityManagerFactory emf =    Persistence.createEntityManagerFactory("leader");
    EntityManager em=emf.createEntityManager();
    em.getTransaction().begin();
    em.persist(leaderA);
    em.persist(leaderB);

   // projectA.setProjectLeader(leaderA);
    projectA.setProjectLeader(leaderB);

    projectB.setProjectLeader(leaderA);
   // projectB.setProjectLeader(leaderB);


    em.persist(projectA);
    em.persist(projectB);
    em.getTransaction().commit();



  }

}
于 2015-05-24T11:37:31.140 に答える