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:多对多的值未插入生成的表中
如何持久化@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.EAGER以FetchType.LAZY获得更好的性能,因为这有可能加载非常大的数据集.
| 归档时间: |
|
| 查看次数: |
10662 次 |
| 最近记录: |