adf4351

大家好。 继续进行ADF + MySQL解决方法系列,今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用。 如果我们使用的是Oracle数据库,则可以使用oracle.jbo.domain.DBSequence以及序列和触发器来立即进行操作。

为简单起见,我们将修改与Entity关联的Java文件,但作为一种好的做法,您应该拥有自己的oracle.jbo.server.EntityImpl类实现并配置JDeveloper,以便它对每个新的版本都使用自己的实现应用程序中的实体。 有关更多信息,请查看此帖子。

这不是有关如何从表中创建ADF BC的分步教程,我们假设您已经具有业务组件定义。

你需要什么

  • JDeveloper 12c
  • MySQL 5.5以上
  • 为ADF开发配置MySQL

这是本文中将要使用的数据库表:

CREATE  TABLE `test`.`Actor` (`id_actor` INT NOT NULL AUTO_INCREMENT ,`name` VARCHAR(100) NOT NULL ,PRIMARY KEY (`id_actor`) );

从表创建实体后,JDeveloper会将您的Entity属性映射到表列,并根据列的类型设置一些属性。 例如,对于我们的PK列(id_actor),JDeveloper会将属性设置为强制性Integer并且始终可更新。 我们需要进行更改,因为我们希望我们的PK在新的(创建新实例时)是可更新的,不是强制性的(因为我们在发布到数据库后正在读取自动增量值):

您的数据库中可能有几个表,因此您的ADF应用程序中有几个实体,但是并非所有的表都可能具有自动增量PK列,因此我们需要一种方法来标记或标识实体的PK属性何时来自数据库的自动增量列。 我们将使用Property Set来做到这一点,它允许我们定义键/值属性的集合,然后我们可以将这些属性关联到属性并在运行时访问它们:

  1. 在JDeveloper中,选择:文件–>新建–>从库…
  2. ADF业务组件中,选择“属性集”
  3. 设置新属性集的名称和包:
  4. 创建后,我们可以定义键/值属性的集合,如果要向用户显示这些属性,我们甚至可以以可翻译模式定义它们。 这不是我们的情况,因此我们将定义一个不可翻译的属性:
  5. 将属性名称设置为AI (对于AutoIncrement),并将其值设置为true (因为使用此属性集的属性来自于autoincrement列):
  6. 现在我们已经准备好属性集,可以在Entity PK属性中使用它:

为了检索PK属性的autoincrement值,我们需要重写Entity类的默认实现(请记住,为简单起见,请执行此操作,但您可以按照本文开头的介绍做得更好)。 我们可以通过为Entity实现Java类,然后重写EntityImpl.doDML(int,TransactionEvent)方法(将更改发布到数据库的位置)来实现:

  1. 转到实体的Java部分,然后单击铅笔图标:

  2. 在弹出窗口中,选择Generate Entity Object Class: ...,然后单击OK:
  3. 现在,Entity类的Java部分显示Java文件,单击指向Java File名称的链接:
  4. JDeveloper将打开一个包含Java代码的新窗口。 复制并粘贴以下方法:
    ...@Overrideprotected void doDML(int i, TransactionEvent transactionEvent) {//got to call first to super, so the record is posted //and we can then ask for the last insert idsuper.doDML(i, transactionEvent);//after the record is inserted, we can ask for the last insert idif (i == DML_INSERT) {populateAutoincrementAtt();}}/** Determines if the Entity PK is marked as an autoincrement col* and executes a MySQL function to retrieve the last insert id*/private void populateAutoincrementAtt() {EntityDefImpl entdef = this.getEntityDef();AttributeDef pk = null;//look for primary key with Autoincrement property setfor (AttributeDef att : entdef.getAttributeDefs()) {if (att.isPrimaryKey() && (att.getProperty("AI") != null && new Boolean(att.getProperty("AI").toString()))) {pk = att;break;}}if (pk != null) {try (PreparedStatement stmt = this.getDBTransaction().createPreparedStatement("SELECT last_insert_id()", 1)) {stmt.execute();try (ResultSet rs = stmt.getResultSet()) {if (rs.next()) {setAttribute(pk.getName(), rs.getInt(1));}}} catch (SQLException e) {e.printStackTrace();}}}
    ...

    上面的代码将更改发布到数据库,然后询问是否要插入值。 如果是这种情况,我们需要检索自动增量值并将其设置在我们的PK属性中。 有关获取自动增量值的更多信息,请参考MySQL函数LAST_INSERT_ID() 。

好的,让我们尝试一下我们的解决方案。 首先,运行您的应用程序模块:

一旦出现Oracle ADF Model Tester工具,请选择(双击)左侧面板上的ActorView1视图对象,然后单击右侧面板上的绿色加号图标,以添加新的Actor:

输入Actor的名称,然后按“将更改保存到数据库”按钮(工具栏上带有清单图标的小数据库):

您会注意到,自动增量值现已设置为idActor属性!

无需担心并发插入,MySQL文档指出可以(请查看此文档):

同时使用多个客户端的LAST_INSERT_ID()和AUTO_INCREMENT列是完全有效的。 每个客户端将收到该客户端执行的最后一条语句的最后插入的ID。

  • 下载本文中使用的ADF项目。

拜拜!

参考:来自Java和ME博客的JCG合作伙伴Alexis Lopez在ADF实体PK属性中使用MySQL自动增量PK列。

翻译自: https://www.javacodegeeks.com/2013/11/using-mysql-autoincrement-pk-column-in-adf-entity-pk-attribute.html

adf4351

adf4351_在ADF实体PK属性中使用MySQL自动增量PK列相关推荐

  1. adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列

    adf 自动输稿器 大家好. 继续进行ADF + MySQL解决方法系列,今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用. 如果使用的是Oracle数据库,则可 ...

  2. 在ADF实体PK属性中使用MySQL自动增量PK列

    大家好. 继续进行ADF + MySQL解决方法系列,今天我们将看到要使用MySQL PK自动增量列和ADF实体PK属性来进行的工作. 如果使用的是Oracle数据库,则可以使用oracle.jbo. ...

  3. java读mysql增量_在Java中检索MySQL自动增量

    我试图从数据库检索idPatient,但我不断收到错误,idPatient是自动增量.但我不知道这是什么原因造成的问题. 这是我正在尝试的代码 public List getPatientsFromD ...

  4. 如何:从 Windows 窗体 DataGridView 控件中移除自动生成的列

    如果将 DataGridView 控件设置为根据其数据源中的数据自动生成列,则可以选择忽略某些列.可以通过调用 Columns 集合的 Remove 方法进行此操作.或者,也可通过将 Visible ...

  5. 在Asp.net core 项目中操作Mysql数据库

    工程环境 : win10+asp.net core 2.1 + vs2017 步骤: 1 在vs中新建asp.net core  项目 2 在Nuget中为项目添加第三方包microsoft.visu ...

  6. ef mysql自动更新_EF Core中怎么实现自动更新实体的属性值到数据库

    我们在开发系统的时候,经常会遇到这种需求数据库表中的行被更新时需要自动更新某些列. 数据库 比如下面的Person表有一列UpdateTime,这列数据要求在行被更新后自动更新为系统的当前时间. Pe ...

  7. Mybatis中resultMap的作用-解决实体类属性名和数据库字段不一致

    解决实体类属性名和数据库字段不一致 转载于:https://www.cnblogs.com/mww-NOTCOPY/p/10950712.html

  8. 现有论文和作者两个实体,论文实体的属性包括题目、期刊名称、年份、期刊号;作者实体的属性包括姓名、单位、地址;一篇论文可以有多个作者,且每一位作者写过多篇论文,在每一篇论文中有作者的顺序号。请完成以下操

    题目要求   现有论文和作者两个实体,论文实体的属性包括题目.期刊名称.年份.期刊号:作者实体的属性包括姓名.单位.地址:一篇论文可以有多个作者,且每一位作者写过多篇论文,在每一篇论文中有作者的顺序号 ...

  9. 【转】MyBatis学习总结(四)——解决字段名与实体类属性名不相同的冲突

    [转]MyBatis学习总结(四)--解决字段名与实体类属性名不相同的冲突 在平时的开发中,我们表中的字段名和表对应实体类的属性名称不一定都是完全相同的,下面来演示一下这种情况下的如何解决字段名与实体 ...

最新文章

  1. MongoDB极简教程
  2. 学python的游戏app_Python教学软件
  3. Windows命令远程执行工具Winexe
  4. 模板方法及策略设计模式实践
  5. 性能之巅:Linux网络性能分析工具-netstat,ifconfig,nicstat,traceroute,tcpdump
  6. nyoj905 卡片游戏
  7. DCMTK:查询/检索服务类用户(C-FIND操作)
  8. 【EF学习笔记09】----------使用 EntityState 枚举标记实体状态,实现增删改查
  9. 知方可补不足~CSS中的几个伪元素
  10. HTML的display属性将行内元素、块状元素、行内块状元素互相转换以及三者的区别
  11. Magento: Beginner’s Guide(书籍推荐)
  12. C语言 随机分形,随机方块生成的分形图案
  13. 长截图或长图片如何按页面切分后打印或插入到Word文档中
  14. Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
  15. Kettle链接MySQL报错:Driver class 'org.gjt.mm.mysql.Driver' could not be found
  16. Eclipse IDE
  17. 解决富文本编辑器wangeditor 光标跳动的问题
  18. 蓝桥 区别质因数,因数
  19. 微软亚洲研究院院友会,AI大牛新动向|AI科技评论周刊
  20. ASEMI四脚整流桥KBP210实物图,KBP210整流桥接线图

热门文章

  1. 阿里云全球布局逾200个数据中心,成立海外孵化中心深耕本地市场
  2. Spring的控制反转(IOC)和依赖注入(DI)具体解释
  3. 大数据系列修炼-Scala课程07
  4. Supervisor行为分析和实践
  5. 在WPF应用程序中利用IEditableObject接口实现可撤销编辑的对象
  6. 【转】SQL存储结构(页)
  7. SpringMVC启动后自动执行
  8. 源码安装postgresql
  9. python3 多进程 同步
  10. python3 连接redis密码中特殊字符问题