在ADF实体PK属性中使用MySQL自动增量PK列
大家好。 继续进行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来做到这一点,它允许我们定义键/值属性的集合,然后我们可以将这些属性关联到属性并在运行时访问它们:
- 在JDeveloper中,选择: File –> New –> From Gallery…
- 在ADF业务组件中,选择“ 属性集”
- 设置新属性集的名称和包:
- 创建之后,我们可以定义键/值属性集,如果要向用户显示这些属性,我们甚至可以以可翻译模式定义它们。 这不是我们的情况,因此我们将定义一个不可翻译的属性:
- 将属性名称设置为AI (对于AutoIncrement),并将其值设置为true (因为使用此属性集的属性来自于autoincrement列):
- 现在我们已经准备好属性集,可以在Entity PK属性中使用它:
为了检索PK属性的autoincrement值,我们需要重写Entity类的默认实现(请记住,为简单起见,请执行此操作,但是您可以按照本文开头的介绍做得更好)。 我们可以通过为Entity实现Java类,然后重写EntityImpl.doDML(int,TransactionEvent)方法(将更改发布到数据库的方法)来实现:
- 转到实体的Java部分,然后单击铅笔图标:
- 在弹出窗口中,选择Generate Entity Object Class: ...,然后单击OK:
- 现在,Entity类的Java部分显示Java文件,单击指向Java File名称的链接:
- 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项目 。
再见!
翻译自: https://www.javacodegeeks.com/2013/11/using-mysql-autoincrement-pk-column-in-adf-entity-pk-attribute.html
在ADF实体PK属性中使用MySQL自动增量PK列相关推荐
- adf4351_在ADF实体PK属性中使用MySQL自动增量PK列
adf4351 大家好. 继续进行ADF + MySQL解决方法系列,今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用. 如果我们使用的是Oracle数据库,则可 ...
- adf 自动输稿器_在ADF实体PK属性中使用MySQL自动增量PK列
adf 自动输稿器 大家好. 继续进行ADF + MySQL解决方法系列,今天我们将看到需要做些什么才能将MySQL PK自动增量列与ADF实体PK属性一起使用. 如果使用的是Oracle数据库,则可 ...
- java读mysql增量_在Java中检索MySQL自动增量
我试图从数据库检索idPatient,但我不断收到错误,idPatient是自动增量.但我不知道这是什么原因造成的问题. 这是我正在尝试的代码 public List getPatientsFromD ...
- mysql 自动增量_MySQL重置自动增量值
在本教程中,我们将向您展示如何重置MySQL中AUTO_INCREMENT列的自动增量值. MySQL提供了一个有用的功能,称为自动增量. 您可以将自动递增属性分配给表的列,以生成新行的唯一标识. 通 ...
- 如何:从 Windows 窗体 DataGridView 控件中移除自动生成的列
如果将 DataGridView 控件设置为根据其数据源中的数据自动生成列,则可以选择忽略某些列.可以通过调用 Columns 集合的 Remove 方法进行此操作.或者,也可通过将 Visible ...
- mysql自动获取时间列_mysql自动获取时间日期的方法
实现方式: 1.将字段类型设为 TIMESTAMP 2.将默认值设为 CURRENT_TIMESTAMP 举例应用: 1.MySQL 脚本实现用例 --添加CreateTime 设置默认时间 CURR ...
- 如何使 Mysql自动生成序号列,序号自动增长
在Oracle中有ROWNUM 这个功能,可以很方便的得到序列号.但是Mysql中始终没有实现这个功能的函数,那当我们需要的时候该怎么处理呢? 使用Msyql的自定义变量 1. 自定义变量放在F ...
- 在Asp.net core 项目中操作Mysql数据库
工程环境 : win10+asp.net core 2.1 + vs2017 步骤: 1 在vs中新建asp.net core 项目 2 在Nuget中为项目添加第三方包microsoft.visu ...
- mysql重置增量_摆脱困境:在每种测试方法之前重置自动增量列
mysql重置增量 当我们为将信息保存到数据库的功能编写集成测试时,我们必须验证是否将正确的信息保存到数据库. 如果我们的应用程序使用Spring Framework,则可以为此目的使用Spring ...
最新文章
- 使用moy快速开发后台管理系统(二)
- linux命令find的功能,linux find命令使用一览表
- 感觉 Mongodb 的操作 还没 mysql 方便 。。。。
- 大数模板(加减乘除幂次开方)
- Equipment upload 不起作用的分析
- 160 - 40 DaNiEl-RJ.1
- 关于“三门问题”的一些想法
- PowerDesigner--创建概念数据模型;并生成逻辑数据模型/物理数据模型/数据库SQL脚本
- 最小高度100%页脚保持在底部的布局方法
- 【jquery】fancybox 是一款优秀的 jquery 弹出层展示插件
- Android 分贝测试仪功能,华为移动终端开发
- jk背带是什么意思_JK 制服和 LO 装 (科普向)
- 保险H5页面、新增模板设计记录
- wuauclt.exe windows 自动更新测试命令
- android拦截所有短信源码,Android手机防短信电话骚扰宝典 手机也会思考
- IT通过什么途径去美国工作?
- HDU6441(费马大定理)
- 说几句得罪人的大实话
- 重装系统win11服务器未响应怎么修复操作
- 【Excel】excel使用VLOOKUP+IF实现多列匹配查找
热门文章
- java 泛型参数的类型_Java获得泛型参数类型
- (转)构建微服务:Spring boot 入门篇
- java数据库编程——执行查询操作(一)
- jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例
- thymeleaf与jsp_PagingAndSortingRepository –如何与Thymeleaf一起使用
- 序列化加密字段_自动加密可序列化的类
- java ee maven_针对新手的Java EE7和Maven项目–第8部分
- jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束
- 如何在CircleCI上构建支持Graal的JDK8?
- Java 11新字符串方法的基准