gpt4 book ai didi

cuba-platform - 使用 EntityListener 创建实体

转载 作者:行者123 更新时间:2023-12-04 03:34:35 24 4
gpt4 key购买 nike

我有一个与 customerBudget 实体有关联的客户。 CustomerEntityListener 将创建一个 customerBudget 实体。

我收到以下错误:

IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: de.company.entity.Customer-c4775b5b-413b-0567-3612-e0860bca9300 [new,managed].

onAfterInsert(客户实体)中的代码
    LoadContext<Customer> loadContext = LoadContext.create(Customer.class);
loadContext.setId(entity.getId());
Customer customer = dataManager.load(loadContext);

CustomerBudget customerBudget = new CustomerBudget();
customerBudget.setCustomer(customer);

CommitContext commitContext = new CommitContext(customerBudget);
dataManager.commit(commitContext);

如何在 EntityListener 中创建和持久化实体?

最佳答案

你可以实现BeforeInsertEntityListener接口(interface)并通过EntityManager在当前持久化上下文中创建一个新实体.

监听器可能如下所示:

@Component("demo_CustomerEntityListener")
public class CustomerEntityListener implements BeforeInsertEntityListener<Customer> {

@Inject
private Metadata metadata;

@Inject
private Persistence persistence;

@Override
public void onBeforeInsert(Customer entity) {
CustomerBudget customerBudget = metadata.create(CustomerBudget.class);
customerBudget.setCustomer(entity);
persistence.getEntityManager().persist(customerBudget);
}
}

新实体将与客户一起在事务提交时保存到数据库中。
Metadata.create()方法是实例化实体的首选方法——对于具有整数标识符的实体,它从序列中分配一个 ID;如果需要,它还可以处理实体扩展。

实体监听器在保存实体的事务中工作,这允许您对数据进行原子更改 - 所有内容都将与调用监听器的实体一起保存或丢弃。

不像 EntityManager , DataManager总是创建一个新的事务。因此,仅当您确实想在单独的事务中加载或保存实体时,才应在实体监听器中使用它。我不确定你为什么会得到这个特殊的异常,但是你的代码看起来很奇怪:你加载了数据库中的 Customer 实例,而不是使用传递给监听器的实例。当我尝试在 HSQLDB 上运行您的代码时,服务器进入了无限锁定 - DataManager 中的新事务等到当前保存客户的事务被提交。

关于cuba-platform - 使用 EntityListener 创建实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36864800/

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