日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

發布時間:2023/12/3 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在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項目 。

    再見!

    參考: 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

    總結

    以上是生活随笔為你收集整理的在ADF实体PK属性中使用MySQL自动增量PK列的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。