0

こんにちは、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();
}

エラーがどこにあるのかわかりません。しかし、私が実体を手に入れたとき、それは間違っていることはできません。グループまたは充電ポイントのリストからエントリを削除または追加することしかできません。

誰かが私を助けてくれることを願っています。

4

1 に答える 1

0

問題の解決策を見つけました。

問題は、結合を持ついくつかの属性があったことです。そして、結合テーブルが空だったので、この結合の 1 つが機能しません。このテーブルにデフォルト値を入力するツールを作成すると、魔法のように機能します。

この問題がどのように正確に解決されたかはわかりませんが、今では問題はなくなり、すべてが機能しています。おそらく、1 つの「nullable」ステートメントが欠落しています。

そして、私たちは皆休止状態を嫌います;-)

しかし、1つの問題が残りました。追加リストからすべてのエンティティを削除することはできません。しかし、これは別の問題です^^。

// 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);
    }

ご助力ありがとうございます!

于 2013-03-04T09:21:46.503 に答える