JPA很多关系没有插入到生成的表中

Fel*_*sso 2 mysql spring many-to-many hibernate jpa

我的项目中有多对多关系,虽然我能够在我的两个实体表中编写,但关系表却没有写任何内容.

以下是我使用JPA注释声明这一点的方法:

Professor.java

@Entity
@Table(name = "Professor")
public class Professor implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "idProfessor", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "ALUNO_PROFESSOR",
            joinColumns = @JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor"),
            inverseJoinColumns = @JoinColumn(name = "idAluno", referencedColumnName = "idAluno"))
    private List<Aluno> alunoList;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

Aluno.java

@Entity
@Table(name = "Aluno")
public class Aluno implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "idAluno", nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToMany(mappedBy = "alunoList", fetch = FetchType.EAGER)
    private List<Professor> professorList;

    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

这是要插入数据库的服务层:

@Autowired
private AlunoDao alunoDao;

@Autowired
private ProfessorDao professorDao;

@RequestMapping(value = RestUriConstants.SUBMETER, method = RequestMethod.POST)
public @ResponseBody JsonResponse submeter(@RequestBody final Aluno aluno) {

    Professor professor = professorDao.find(1);
    aluno.setProfessorList(Arrays.asList(professor));
    alunoDao.persist(aluno);

    ...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请考虑我已经为教授提供了ID为"1"的条目.

正如我所说,它确实写在Aluno和教授表上,但不会在ALUNO_PROFESSOR表中写入任何内容.

我已经看过这三种类似的问题,但没有一个可以帮助我:

Hibernate和Spring:多对多的值未插入生成的表中

JPA多对多持续加入表

如何持久化@ManyToMany关系 - 重复条目或分离实体

编辑 - 添加更多代码段

JpaAlunoDao.java

@Repository
public class JpaAlunoDao implements AlunoDao {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void persist(Aluno aluno) {
        em.persist(aluno);
    }
}
Run Code Online (Sandbox Code Playgroud)

JpaExercicioDao.java

@Repository
public class JpaExercicioDao implements ExercicioDao {

    @PersistenceContext
    private EntityManager em;

    @Transactional
    public void persist(Exercicio exercicio) {
        em.persist(exercicio);
    }
}
Run Code Online (Sandbox Code Playgroud)

man*_*ish 10

试试这个:

public class Professor {
  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinTable(name = "ALUNO_PROFESSOR",
        joinColumns = @JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor"),
        inverseJoinColumns = @JoinColumn(name = "idAluno", referencedColumnName = "idAluno"))
  private List<Aluno> alunoList;
}

public class Aluno {
  @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
  @JoinTable(name = "ALUNO_PROFESSOR",
        joinColumns = @JoinColumn(name = "idAluno", referencedColumnName = "idAluno"),
        inverseJoinColumns = @JoinColumn(name = "idProfessor", referencedColumnName = "idProfessor"))
  private List<Professor> professorList;
}
Run Code Online (Sandbox Code Playgroud)

这将确保两个实体上的多对多关系的元数据可用,并且关系任一侧的操作级联到另一侧.

我还建议更换FetchType.EAGERFetchType.LAZY获得更好的性能,因为这有可能加载非常大的数据集.