gpt4 book ai didi

java - 为什么此 JPA 2.0 实体仅在 find() 之后合并?

转载 作者:行者123 更新时间:2023-11-29 09:28:40 25 4
gpt4 key购买 nike

我的应用程序在第一个事务中创建了一个对象。然后,另一个事务尝试用这些更改更新数据库,但不是更新实体,而是创建一个新实体。如果我在 merge 之前执行了 find,那么正确的记录就会被更新。这是为什么?

这是实体:

@Entity
public class MyObject implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MY_SEQ")
@SequenceGenerator(name = "MY_SEQ", sequenceName = "MY_SEQ_GEN", allocationSize = 1)
Long id;

String stuff;
String businessKey;

// getter, setters, hashcode, equals (using "businessKey")
}

此记录已创建和更新:(请参阅下面的 createupdate):

MyObject obj = bean.create();
bean.update(obj);

但是如前所述,这无法更新第一条记录,而是创建了另一条记录!

如果我尝试在合并操作之前找到这个实体(甚至没有对返回的对象做任何事情),那么它就会被正确更新(参见下面的createfindAndUpdate):

MyObject obj = bean.create();
bean.findAndUpdate(obj);

这是 EJB:

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
@Stateless
public class Bean {

final static Logger LOGGER = LoggerFactory.getLogger(Bean.class);

@PersistenceContext(unitName = "MYUNIT")
EntityManager em;

public MyObject create(){

MyObject obj = new MyObject();
obj.businessKey = "some string";

em.persist(obj);

LOGGER.debug("MyObject.id: {}", obj.id); // eg. 100

return obj;
}

public void update(MyObject obj){

obj.stuff = "some stuff";

MyObject merged = em.merge(obj);

LOGGER.debug("obj.id: {}", obj.id); // still 100
LOGGER.debug("merged.id: {}", merged.id); // new id: 101!

}

public void findAndUpdate(MyObject obj){

obj.stuff = "some stuff";

em.find(MyObject.class, obj.id); // doing nothing with the returned MyObject

MyObject merged = em.merge(obj);

LOGGER.debug("obj.id: {}", obj.id); // still 100
LOGGER.debug("merged.id: {}", merged.id); // still 100!

}
}

最佳答案

问题似乎在给定的代码之外。我猜你传递给 update() 的 MyObject 实例是通过调用 new 或通过某种反序列化创建的,例如来自 JSON。实体管理器实例 em(通常在请求开始时创建并在请求结束后销毁)只包含由它加载的实体。这些实体在查找时通过引用进行比较,但不测试键是否相等。本质上,使用 contains,你是在问它“你在跟踪我的对象的这个实例吗?”,并且你可以拥有一个对象的多个实例,这些实例属于同一类,具有相同的主键,但实体管理器不会跟踪它们,除非您收到它的引用。

关于java - 为什么此 JPA 2.0 实体仅在 find() 之后合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35037147/

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