你好,我在 Hibernate 中遇到了多对多映射的问题。
上面显示的表通过多对多映射连接。表 tbl_cp_group_relation 是具有 n:m 个连接的表。
在我的实体中,我通过多种方式解决了这个问题。我使用了多对多映射和多对一映射。在这两种方式中,它都起到了部分作用。我得到了一个充电点的组,我得到了一个组的充电点。但我永远无法将充电点添加到一个或多个充电点。如果我将充电点添加到程序运行的组中,并且组中还有更多充电点,直到我离开该功能。如果我尝试将组添加到充电点,我总是会收到重复密钥错误消息。
这是我的团体实体。
@Entity
@Table(name = "tbl_cp_group")
public class CpGroupEntity {
...
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tbl_cp_group_relation", joinColumns = { @JoinColumn(name = "cp_group_id") }, inverseJoinColumns = { @JoinColumn(name = "cp_id") })
private List<ChargingPointEntity> cps = new ArrayList<ChargingPointEntity>();
...
}
这是我的充电点实体。
@Entity
@Table(name = "tbl_charging_point")
public class ChargingPointEntity {
...
@OneToMany(cascade = CascadeType.ALL)
@JoinTable(name = "tbl_cp_group_relation", joinColumns = { @JoinColumn(name = "cp_id") }, inverseJoinColumns = { @JoinColumn(name = "cp_group_id") })
private List<CpGroupEntity> groups = new ArrayList<CpGroupEntity>();
...
}
这是我的函数的代码
@Transactional
public void administrateGroupCP(GroupDiff diff, long groupId, String username) throws BadInputRoutingException, NoSuchGroupException,
NotAuthorizedException, NoSuchChargingPointException {
try {
// Create add list
List<Long> addList = diff.getAdd();
// Get entities from database
CpGroupEntity groupEntity = cpGroupDAO.getGroup(groupId);
UserEntity userEntity = userDAO.getUser(username);
// Add charging points
addChargingPoints(addList, groupEntity, userEntity);
// Remove charging points
// removeChargingPoints(removeList, groupEntity, userEntity);
} catch (EntityNotFoundException e) {
throw new NoSuchGroupException();
}
}
@Transactional
private void addChargingPoints(List<Long> addList, CpGroupEntity groupEntity, UserEntity userEntity) throws NoSuchChargingPointException,
BadInputRoutingException {
...
// Add charging points to group
// 1. Clear list of charging points. Remove charging points which are to ignore from the charging point list with the add items
addEntitiesList.removeAll(ignore);
if (0 < addEntitiesList.size()) {
// 2. Add charging points to charging point list of entity
groupEntity.getCps().addAll(addEntitiesList);
// 3. Save changes
cpGroupDAO.updateChargingPoints(groupEntity);
}
}
}
这里是cpGroupDAO的功能
public void updateChargingPoints(CpGroupEntity group) {
entityManager.merge(group);
entityManager.flush();
}
我不知道我的错误在哪里。但是,当我得到实体时,这不可能是错的。我只能在群组或充电点列表中删除或添加条目。
我希望有一个人可以帮助我。