0

我有一个计费页面,其中包含几个类别的信息以及它们的价格、数量和总数

计费屏幕看起来像

客户名称:Dummy Customer 客户地点:Dummy Place

类别名称 数量 价格 总计 TestCategory 10 10 100 TestCategory1 15 10 150

                                         Total 250

添加新类别 确定 更新 删除

屏幕上有 3 个按钮“确定”、“更新”和“删除”

一旦用户单击确定按钮,信息就会作为新的 tranx 保存到数据库中

Tranx 模型类似于

Master_Tranx实体,包含 TranxID Tranx_Total Customer Name Customer Place

然后是由 SerialNumber/category/Quantity/Price/Tranx_id 组成的Tranx 实体

Master_Tranx 实体和 Tranx 实体之间的关系就像

Master_Traxn 主键是 Tranx_id,它连接到 Tranx 实体中的外键 tranx_id。

因此,当用户按下 ok 时,会在 Tranx 和 Master_Tranx 实体中生成一条新记录

对于每张新账单,多行进入 Tranx 表,但单行插入 Master_Tranx 实体。

现在问题在于更新。

按 OK 按钮成功将数据创建到上述两个实体中,但是

假设用户想要更新任何现有的 tranx,例如在现有 traxn 中添加更多类别,或者更新可能是计费表现有行的数量,用户需要在将所需内容更新到屏幕后按下更新按钮。

我在这个更新按钮中实现代码的方式就像

我使用我需要进行更新的 tranx_id 。然后在计费屏幕中获取所有行。然后填充由 Tranx 实体组成的 Master_Tranx 实体,该 tranx 实体由所有计费表行组成。

然后使用实体管理器的 merge() 函数进行更新。

问题是当我按下更新按钮而不是更新现有的 tranx infomration 时。它针对这个 tranx ID 添加新行

例如:我想创建一个新信息。我添加新行,例如

类别名称 数量 价格 总计 TestCategory 10 10 100 TestCategory1 15 10 150

然后我按 OK 按钮,然后生成一个 tranx ID

现在我想在现有的 tranxID 中再添加一个 tranx,例如

类别名称 数量 价格 总计 TestCategory 20 10 200 TestCategory1 15 10 150 TestCategory3 20 15 300

我也对第一行的数量进行了更改,我从 10 做 20。然后我按下更新按钮

在针对 TranxEntity 的数据库中,我可以看到类似的行

1 测试类别 10 10 100 2 测试类别 1 15 10 150 3 测试类别 20 10 200 4 测试类别 1 15 10 150 5 测试类别 3 20 15 300

虽然它应该是这样的

1 测试类别 20 10 200 2 测试类别 1 15 10 150 3 测试类别 3 20 15 300

谁能告诉如何实现这一目标

4

1 回答 1

0
  • 首先,作为“OK”操作的一部分,通过new MasterTranx()和创建新实体new Tranx(),通过 持久化它们entityManager.persist()。你已经在这样做了。
  • 接下来,如果您不想执行“更新”:您绝不能再次创建新实体。不要这样做:new MasterTranx()new Tranx()
  • 相反,要么从“OK”重用应用程序内存中的相同实体实例。或者使用 entityManager.find() 或 entityManager.createQuery() 从数据库中再次检索相同的实体。
  • 如果实体分离(例如,通过 em.detach(ent) 或 em.clear() 或事务范围实体管理器的事务结束或通过网络传递序列化对象),则可以。
  • 您的用户界面代码应在检索到的(和可能分离的)实体中设置数据
  • 然后打电话

    MasterTranx masterTranx2 = em.merge(masterTranx);

           // masterTranx could be detached
           // masterTranx2 is not detached - it is guaranteed to be managed.
    

    tranx tranx2 = em.merge(tranx);

    • 确保您启动实体管理器(或 EJB)事务并提交,以便更新的数据将自动刷新到数据库

完毕。= :-)

于 2012-10-15T03:21:59.183 回答