Hallo我在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();
}
我不知道我的错误在哪里。但是,当我得到实体时,错误就不可能了。我只能删除或添加条目列表或收费点。
我希望有人可以帮助我。
答案 0 :(得分:0)
我们找到了问题的解决方案。
问题是,连接有几个属性。其中一个连接不起作用,因为连接表是空的。我们编写了一个用默认值填充此表的工具,现在它以神奇的方式工作。
我们不知道问题究竟是如何解决的,但现在它已经消失了,一切正常。可能是一个可空的&#34;声明已经缺失。
我们都讨厌Hibernate ;-)
但还有一个问题。无法从添加列表中删除所有实体。但这是另一个问题^^。
// 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);
}
非常感谢你的帮助!