2

Spring を使用する Java アプリと、JPA 2.0 仕様を使用する Hibernate があります。

for ループで 100 個の「ノード」を永続化しようとしています。for ループを進めながら各ノードを永続化します。また、既に永続化しているノードの一部を取得して、座標は別として、新しいノードをそれらのいずれかの浅いクローンにするかどうかを確認します。(基本的に私は地図を作っていますが、時々、正方形を互いに同一にしたいことがあります。)

ただし、永続化したいものすべてが永続化されているわけではないという問題があり、休止状態/JPAが私を台無しにしています。

すべてが 1 つのトランザクションで行われます。

int startingX = sn.getxCoor() * 10;
int startingY = sn.getyCoor() * 10;
for (int nodeX = startingX; nodeX < startingX + 10; nodeX++) {
    for (int nodeY = startingY; nodeY < startingY + 10; nodeY++) {
        ns.persistNodeIfNotExistent(this.generateNode(nodeX, nodeY, sn));
    }
}

public void persistNodeIfNotExistent(Node toPersist) {
    if (nd.getNode(toPersist.getxCoor(), toPersist.getyCoor()) == null) {
        nd.merge(toPersist);
    }
}


public Node generateNode(int nodeX, int nodeY, SuperNode sn) {
    Node newNode = nodeIsDuplicate(nodeX, nodeY);
    if (newNode == null) {
        newNode = new Node();
        [bunch of irrelevant stuff gets set]
    }
    newNode.setxCoor(nodeX);
    newNode.setyCoor(nodeY);
    return newNode;
}

public Node nodeIsDuplicate(int nodeX, int nodeY) {
    Node nodeToReturn = null;
    List<Node> adjacentNodes = ns.getAdjacentNodes(nodeX, nodeY);
    int chanceItsDuplicate = 20 * adjacentNodes.size();
    if (randomizer.randomInt99() < chanceItsDuplicate) {
        Node adjNode = adjacentNodes
                .get(randomizer.getRandom().nextInt(adjacentNodes.size()));
        ns.detach(adjNode);
        nodeToReturn = new Node();
        BeanUtils.copyProperties(adjNode, nodeToReturn);
    }
    return nodeToReturn;
}

この混乱全体を修正するための私の最初の戦略は、Spring の BeanUtils を使用してプロパティをコピーすることでした。次に、エンティティマネージャーを介してデタッチを追加して、デタッチされていることを確認しようとしましたが、サービスレイヤーでは、データベースが完全に消去されても、「getNode」メソッドが一連の結果で表示されることがわかります。

Hibernate が毎回私を妨害することなく、私のエンティティをコピーする簡単で正気な方法はありますか?

4

1 に答える 1

1

私の問題は、元のノードの主キーに設定された主キー、ID を持っていたことでした。コピーの ID を手動で 0 に設定すると、機能しました。私はMySQLを使用しているので、それが他のデータベースで機能するかどうかはわかりませんが、Javaの「int」のデフォルト値が常に0であることを考慮すると、そうすべきです。

于 2013-02-09T22:22:51.863 に答える