gpt4 book ai didi

java - Hibernate 的恶作剧——我只想要一个非托管副本

转载 作者:行者123 更新时间:2023-11-30 11:35:59 25 4
gpt4 key购买 nike

我有一个使用 Spring 的 Java 应用程序,以及使用 JPA 2.0 规范的 Hibernate。

我试图在 for 循环中保留 100 个“节点”。当我在 for 循环中取得进展时,我坚持每个节点,有时我会得到一些我已经坚持的节点,看看我是否希望我的新节点成为其中一个节点的浅克隆,除了它的坐标。 (基本上我在制作 map ,有时我希望我的方 block 彼此相同。)

我一直遇到这样的问题,即并非所有我想要保留的内容都被保留,而且是 hibernate/JPA 把我搞砸了。

整个事情发生在一次交易中。

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 复制属性,我认为这会给我一个非托管副本,但它们并没有全部持久化,所以它不能。然后我通过我的 entityManager 添加了 detach 以尝试确保它被分离,但是在服务层我仍然可以看到“getNode”方法出现了一堆结果,即使数据库被清除了。

有没有任何简单而明智的方法来复制我的实体,而 Hibernate 每次都不会阻止我?

最佳答案

原来我的问题是他们有他们的主键,他们的 Id,设置为原始节点的主键。当我手动将副本的 Id 设置为 0 时,它起作用了。我正在使用 MySQL,所以不确定它是否适用于其他数据库,但考虑到 java“int”始终具有默认值 0,它应该。

关于java - Hibernate 的恶作剧——我只想要一个非托管副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14786700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com