Hibernate多对多映射:添加条目不起作用

时间:2013-01-30 09:24:49

标签: java hibernate many-to-many transactional

Hallo我在Hibernate中遇到多对多映射问题。

Tables of the many-to-many relationship

上面显示的表格与多对多映射相关联。表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();
}

我不知道我的错误在哪里。但是,当我得到实体时,错误就不可能了。我只能删除或添加条目列表或收费点。

我希望有人可以帮助我。

1 个答案:

答案 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);
    }

非常感谢你的帮助!