1. 程式人生 > 實用技巧 >深度學習模型調優方法(Deep Learning學習記錄)

深度學習模型調優方法(Deep Learning學習記錄)

使用 IntelliJ IDEA 建立專案,建立時選擇 JavaEE Persistence

2.建立成功後,新增依賴jar,由於 Jpa 只是一個規範,因此我們說用Jpa實際上必然是用Jpa的某一種實現,那麼是哪一種實現呢?當然就是Hibernate了,所以新增的jar,實際上來自 Hibernate,如下

3.新增實體類

接下來在專案中新增實體類,如下:

@Entity(name = "t_book")
public class Book {
    private Long id;
    private String name;
    private String author;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    // 省略其他getter/setter
}

首先@Entity註解表示這是一個實體類,那麼在專案啟動時會自動針對該類生成一張表,預設的表名為類名,@Entity註解的name屬性表示自定義生成的表名。@Id註解表示這個欄位是一個id,@GeneratedValue註解表示主鍵的自增長策略,對於類中的其他屬性,預設都會根據屬性名在表中生成相應的欄位,欄位名和屬性名相同,如果開發者想要對欄位進行定製,可以使用@Column註解,去配置欄位的名稱,長度,是否為空等等。

  1. 建立persistence.xml

JPA 規範要求在類路徑的 META-INF 目錄下放置persistence.xml,檔案的名稱是固定的

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <class>org.sang.Book</class>
        <properties>
            <property name="hibernate.connection.url"
                      value="jdbc:mysql:///jpa01?useUnicode=true&amp;characterEncoding=UTF-8"/>
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
            <property name="hibernate.connection.username" value="root"/>
            <property name="hibernate.connection.password" value="123"/>
            <property name="hibernate.archive.autodetection" value="class"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>
  • persistence-unit 的name 屬性用於定義持久化單元的名字, 必填。
  • transaction-type:指定 JPA 的事務處理策略。RESOURCE_LOCAL:預設值,資料庫級別的事務,只能針對一種資料庫,不支援分散式事務。如果需要支援分散式事務,使用JTA:transaction-type=”JTA”
  • class節點表示顯式的列出實體類
  • properties中的配置分為兩部分:資料庫連線資訊以及Hibernate資訊
  1. 執行持久化操作
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NewPersistenceUnit");
EntityManager manager = entityManagerFactory.createEntityManager();
EntityTransaction transaction = manager.getTransaction();
transaction.begin();
Book book = new Book();
book.setAuthor("羅貫中");
book.setName("三國演義");
manager.persist(book);
transaction.commit();
manager.close();
entityManagerFactory.close();

這裡首先根據配置檔案創建出來一個 EntityManagerFactory ,然後再根據 EntityManagerFactory
的例項創建出來一個 EntityManager ,然後再開啟事務,呼叫 EntityManager 中的 persist
方法執行一次持久化操作,最後提交事務,執行完這些操作後,資料庫中舊多出來一個 t_book 表,並且表中有一條資料。

關於 JPQL

  1. JPQL語言,即 Java Persistence Query Language 的簡稱。JPQL 是一種和 SQL
    非常類似的中間性和物件化查詢語言,它最終會被編譯成針對不同底層資料庫的 SQL 查詢,從而遮蔽不同資料庫的差異。JPQL語言的語句可以是
    select 語句、update 語句或delete語句,它們都通過 Query 介面封裝執行。
  2. Query介面封裝了執行資料庫查詢的相關方法。呼叫 EntityManager 的 createQuery、create
    NamedQuery 及 createNativeQuery 方法可以獲得查詢物件,進而可呼叫 Query 介面的相關方法來執行查詢操作。
  3. Query介面的主要方法如下:
    • int executeUpdate();用於執行update或delete語句。
    • List getResultList();用於執行select語句並返回結果集實體列表。
    • Object getSingleResult();用於執行只返回單個結果實體的select語句。
    • Query setFirstResult(int startPosition);用於設定從哪個實體記錄開始返回查詢結果。
    • Query setMaxResults(int maxResult);用於設定返回結果實體的最大數。與setFirstResult結合使用可實現分頁查詢。
    • Query setFlushMode(FlushModeType flushMode);設定查詢物件的Flush模式。引數可以取2個列舉值:FlushModeType.AUTO 為自動更新資料庫記錄,FlushMode Type.COMMIT 為直到提交事務時才更新資料庫記錄。
    • setHint(String hintName, Object value);設定與查詢物件相關的特定供應商引數或提示資訊。引數名及其取值需要參考特定 JPA 實現庫提供商的文件。如果第二個引數無效將丟擲IllegalArgumentException異常。
    • setParameter(int position, Object value);為查詢語句的指定位置引數賦值。Position 指定引數序號,value 為賦給引數的值。
    • setParameter(int position, Date d, TemporalType type);為查詢語句的指定位置引數賦 Date 值。Position 指定引數序號,value
      為賦給引數的值,temporalType 取 TemporalType 的列舉常量,包括 DATE、TIME 及 TIMESTAMP
      三個,,用於將 Java 的 Date
      型值臨時轉換為資料庫支援的日期時間型別(java.sql.Date、java.sql.Time及java.sql.Timestamp)。
    • setParameter(int position, Calendar c, TemporalType type);為查詢語句的指定位置引數賦 Calenda r值。position 指定引數序號,value 為賦給引數的值,temporalType 的含義及取捨同前。
    • setParameter(String name, Object value);為查詢語句的指定名稱引數賦值。
    • setParameter(String name, Date d, TemporalType type);為查詢語句的指定名稱引數賦 Date 值,用法同前。
    • setParameter(String name, Calendar c, TemporalType type);為查詢語句的指定名稱引數設定Calendar值。name為引數名,其它同前。該方法呼叫時如果引數位置或引數名不正確,或者所賦的引數值型別不匹配,將丟擲 IllegalArgumentException 異常。

JPQL 舉例

和在 SQL 中一樣,JPQL 中的 select 語句用於執行查詢。其語法可表示為:select_clause form_clause [where_clause] [groupby_clause] [having_clause] [orderby_clause]

其中:

  1. from 子句是查詢語句的必選子句。
  2. select 用來指定查詢返回的結果實體或實體的某些屬性。
  3. from 子句宣告查詢源實體類,並指定識別符號變數(相當於SQL表的別名)。
  4. 如果不希望返回重複實體,可使用關鍵字 distinct 修飾。select、from 都是 JPQL 的關鍵字,通常全大寫或全小寫,建議不要大小寫混用。

在 JPQL 中,查詢所有實體的 JPQL 查詢語句很簡單,如下:select o from Order o 或 select o from Order as o
這裡關鍵字 as 可以省去,識別符號變數的命名規範與 Java 識別符號相同,且區分大小寫,呼叫 EntityManager 的
createQuery() 方法可建立查詢物件,接著呼叫 Query 介面的 getResultList() 方法就可獲得查詢結果集,如下:

Query query = entityManager.createQuery( "select o from Order o");
List orders = query.getResultList();
Iterator iterator = orders.iterator();
while(iterator.hasNext() ) { // 處理Order
}

其他方法的與此類似,這裡不再贅述。