这似乎应该是死的简单,所以我必须遗漏一些东西.我只想按名称设置模型实例中字段的值.说我有:
class Foo(Model):
bar = CharField()
f = Foo()
Run Code Online (Sandbox Code Playgroud)
我想按名称设置bar的值,而不是通过访问该字段.所以类似于:
f.fields['bar'] = 'BAR"
Run Code Online (Sandbox Code Playgroud)
代替
f.bar = 'BAR'
Run Code Online (Sandbox Code Playgroud)
我已经尝试过setattr,但它不会在数据库中保留该值.我也尝试过_meta.fields,但在此过程中遇到了各种错误.
我有一个无状态的豆类似于:
@Stateless
public class MyStatelessBean implements MyStatelessLocal, MyStatelessRemote {
@PersistenceContext(unitName="myPC")
private EntityManager mgr;
@TransationAttribute(TransactionAttributeType.SUPPORTED)
public void processObjects(List<Object> objs) {
// this method just processes the data; no need for a transaction
for(Object obj : objs) {
this.process(obj);
}
}
@TransationAttribute(TransactionAttributeType.REQUIRES_NEW)
public void process(Object obj) {
// do some work with obj that must be in the scope of a transaction
this.mgr.merge(obj);
// ...
this.mgr.merge(obj);
// ...
this.mgr.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
通常用法是客户端将调用processObjects(...),它实际上不与实体管理器交互.它完成了它需要做的事情,并为每个要处理的对象单独调用进程(...).进程的持续时间(...)相对较短,但是processObjects(...)可能需要很长时间来运行所有内容.因此我不希望它维持一个开放的交易.我确实需要单独的进程(...)操作才能在自己的事务中运行.这应该是每次通话的新交易.最后,我想保持选项打开,让客户端直接调用进程(...).
我尝试了许多不同的事务类型:从不,不支持,支持(在processObjects上)和required,需要new(on process)但每次调用merge()时都会得到TransactionRequiredException.
我已经能够通过将方法分成两个不同的bean来使它工作:
@Stateless
@TransationAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class MyStatelessBean1 …Run Code Online (Sandbox Code Playgroud)