HIBERNATE如何直接把瞬時TRANSIENT对象UPDATE成持久化对象

2019-03-25 13:45|来源: 网路

因为从表单出来的对象都是瞬时对象,但是UPDATE的时候岂不是还要重新把持久对象LOAD出来再封装值?
我用MERGE做提示好像和乐观锁冲突。所以大神帮忙应该怎么做啊

问题补充:也就是他只是通过主键关联,但是不允许同时有两个主键相同的对象在缓存里对么?
wangyijiangshui 写道
从表单出来的对象虽然是瞬时对象,但是只要你的主键有值,你直接update,Hibernate会自动更新数据库中对应主键的记录的,不用重新手动load出来原数据库的值,然后再封装在保存

说到底就是你要是update就提前把对象中的主键赋值,主键有值,hibernate更新,否则新增

必要时可以考虑用saveOrUpdate


问题补充:另外,我是用了乐观锁,obj是表单传回对象,initObj是数据库对象
session.evict(initObj);
obj.setId(initObj.getId());
session.update(obj);
这样子的话报错,java.lang.NullPointerException
at org.hibernate.engine.Versioning.increment
我应该怎么做呢
wangyijiangshui 写道
从表单出来的对象虽然是瞬时对象,但是只要你的主键有值,你直接update,Hibernate会自动更新数据库中对应主键的记录的,不用重新手动load出来原数据库的值,然后再封装在保存

说到底就是你要是update就提前把对象中的主键赋值,主键有值,hibernate更新,否则新增

必要时可以考虑用saveOrUpdate

相关问答

更多
  • 持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例----持久态(Persistent)。当事务提交时,通过执行SQL的INSERT,UPDATE和DELETE语句把内存中的状态同步到数据库中。 java对象何时会进入持久化状态? (1) Session的save()方法把临时对象转变为持久化对象。 (2) Session的load()或get()方法返回的对象总是处于持久化状态。 (3) Session的find()方法返回的List集合中存放的都是持久化对象。 (4) Se ...
  • 不用判断,在事务之间,用session 查询的都是持久化对象, 不过好像有方法移除和加入持久化吧
  • hibernate执行sql语句不代表数据更新。 就算是不使用hibernate,如果开启一个事务,插入一条数据,马上查询能查到。 但是不提交事物,别人就查不到。 回滚事务,自己也查不到了。 不提交直接中断连接,下次连接自己也查不到了。 所以说执行数据更新语句,如果不提交事物,数据库最后仍然会回滚掉此次更新。 hibernate,执行flush仅仅是执行SQL语句。但是如果不提交事物,仍然会回滚。
  • 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。 关键就是内存的数据会丢失,所以我们要把它保存在存储设备中,以便下次需要的时候可以再把数据取出来 其实说白点 就是把数据存到硬盘上不会丢失的地方。 1.应用程序层次结构演变 这里本来应该有张描述应用程序结构演变的图,可是CSDN在这里上传不了,所以没有传上来. 纵观几十年的计算机应用软件的演变过程,应用程 ...
  • 一个与Session不相关联的持久化类的new实例,在数据库中没有表示形式,Hibernate没有标识符值被认为是暂时的: Person person = new Person(); person.setName("Foobar"); // person is in a transient state 持久性实例在数据库中具有表示形式,标识符值与Session相关联。 您可以通过将其与一个Session关联来使一个暂时的实例持久化 : Long id = (Long) session.save(perso ...
  • 我已经完成了这个使用分开的声明。 public void ConfigureServices(IServiceCollection services) { services.AddDbContext(options => options.UseMySQL(Configuration["ConnectionStrings:DefaultConnection"])); services.AddTransient
  • 您无法从瞬态对象获取id,根据定义,瞬态对象没有id。 如果你创建一个新对象,为什么要进行合并? 创建新对象时,应保存它。 如果更改现有对象的值,则应更新它。 只有当持久化的对象变得分离并且您需要重新附加它时,才应该合并。 You cannot get an id from a transient object, by definition a transient object does not have an id. why are you doing a merge if you create a ne ...
  • 我建议你去寻找接口org.hibernate.Session那里你可以找到方法包含的内容 ,这个方法会查看它与该会话关联的给定对象(持久化),如果不是,并不意味着它被分离,因为它可能与其他会话相关联(如果有的话)。 I recommend you to look for the interface org.hibernate.Session there you can find the method contains, this method will look if the given object it ...
  • 我找到了几种可能的解决方案,但我不确定在保持事物清洁和安全方面哪一个最好(以便恶意用户不能仅仅编辑他们希望的任何对象ID)。 您提到的两种方法都不会真正处理试图编辑用户未被授权的对象的用户。 在一天结束时,提交表单的用户需要告诉你他们提交数据的对象 - 不管它是在URL参数中还是在隐藏的表单参数中。 我会说,你选择哪一个是风格和个人喜好的问题,真的。 但是,无论您选择什么,您需要做的事情是验证当前登录的用户有权在处理表单提交时更改对象。 这意味着您需要检查该用户是否有权编辑当前的对象ID,使用包含“允许为此 ...
  • 如果你仔细想想,你所看到的就是完美的感觉。 EntityC是关系C <> B的“拥有方”:它定义了JoinColumn,而EntityB具有'mappedBy'属性。 所以在保存C时,事件的顺序通常是: 插入C / update C 插入B /更新B 现在在你的情况下,这会引起问题,因为如果B先被保留,显然只能保存C. 就你上面的陈述而言:我想坚持“EntityB ONLY,如果我能坚持EntityC。” 这怎么可能? JPA有一个'派生标识符'的概念,我并不过分熟悉,但在Pro JPA一书中定义的是: 当 ...