麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

SQLite數據庫和JPA簡單介紹

2019-11-14 21:18:52
字體:
來源:轉載
供稿:網友
SQLite數據庫和JPA簡單介紹SQLite數據庫和JPA簡單介紹

一、SQLite簡單使用

SQLite是遵循ACID的關系數據庫管理系統,它的處理速度很快,它的設計目標是嵌入式的,只需要幾百K的內存就可以了。

1.下載SQLitehttp://www.sqlite.org/download.htmlsqlite-dll-win32-x86-201410071659.zip(294.11 KiB)sqlite-shell-win32-x86-3080600.zip解壓在文件夾D:/Database/sqlite下,得到文件sqlite3.dll,sqlite3.exe參考:http://www.w3cschool.cc/sqlite/sqlite-installation.html

2.安裝SQLite寫批處理文件z_sqlite.bat,內容是:

@echod:cd D:/Database/sqlitecmd.exe

執行命令sqlite3,看到結果:

D:/Database/sqlite>sqlite3SQLite version 3.8.6 2014-08-15 11:46:33Enter ".help" for usage hints.Connected to a transient in-memory database.Use ".open FILENAME" to reopen on a persistent database.sqlite>

或是:

@echoPATH=%PATH%;D:/Database/sqlitecmd.exe

執行命令sqlite3,看到結果:

ECHO 處于打開狀態。D:/Database>PATH=C:/PRogramData/Oracle/java/javapath;D:/Program_Files/oraclexe/app/oracle/product/10.2.0/server/bin;C:/Program Files/AMD APP/bin/x86;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program Files/ATI Technologies/ATI.ACE/Core-Static;C:/Python27;C:/Program Files/MySQL/MySQL Server 5.5/bin;D:/Idea/config/apache-maven-3.2.3/bin;D:/Idea/config/apache-ant-1.9.4/bin;D:/Database/sqliteD:/Database>cmd.exeMicrosoft Windows [版本 6.3.9600](c) 2013 Microsoft Corporation。保留所有權利。D:/Database>sqlite3SQLite version 3.8.6 2014-08-15 11:46:33Enter ".help" for usage hints.Connected to a transient in-memory database.Use ".open FILENAME" to reopen on a persistent database.sqlite>

表明sqlite已安裝。解釋:不讓bat文件運行命令結束后cmd窗口自動關閉,最后運行一下cmd.exe

更多疑問請參考:[SQLite 教程]:http://www.w3cschool.cc/sqlite/sqlite-installation.html

3.SQLite命令

.help    幫助.show   顯示各種設置的當前值.schema   顯示建表語句

sqlite> .schema sqlite_mastercreate table episodes( id integer primary key, season int, name text );

其它的命令類似于一搬的sql語句

insert into episodes values(1, 1, 'one');select * from episodes;

4.SQLite管理工具:SQLiteExpert下載:http://www.sqliteexpert.com/download.html選擇免費版:SQLite Expert Personal下載的太慢了,可以選擇以前的版本:http://dl.dbank.com/c0sog1u0xb

創建db文件:

D:/Database/sqlite>sqlite3 test1.dbSQLite version 3.8.6 2014-08-15 11:46:33Enter ".help" for usage hints.sqlite> sqlite3 test1.db;Error: near "sqlite3": syntax errorsqlite> 

看到在D:/Database/sqlite目錄下生成了一個test1.db的文件File>OpenDatabase>選擇剛剛生成的db文件>確定看到數據庫的文件已經導入:

二、JPA介紹Java Persistence API:簡化現有的持久化開發工作和整合ORM技術結束現在的Hibernate、TopLink、JDO等ORM框架各自為營的局面面向Hibernate的API開發,會緊密的與Hibernate耦合JPA規范是由Hibernate的作者制定的

ORM映射元數據:  描述對象與表之間的映射關系Java持久化API:   執行CRUD操作查詢語言:     JPQL,避免程序和SQL語句的緊密耦合

設置Maven4MyEclipse:MyEclipse>Maven4MyEclipse

Installation=D:/Idea/config/apache-maven-3.2.3User Settings=D:/Idea/config/apache-maven-3.2.3/conf/settings.xmlLocal Repository=D:/Idea/maven/repository

配置文件:META-INF/persistence.xmlD:/Idea/config/hibernate-release-4.3.6.Final/lib/jpa-metamodel-generator/hibernate-jpamodelgen-4.3.6.Final.jar/persistence_2_1.xsd配置數據庫的方言,以及自動建表

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence                         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd ">    <persistence-unit name="module1" transaction-type="RESOURCE_LOCAL">        <properties>            <property name="hibernate.hbm2ddl.auto" value="update" />            <property name="hibernate.show_sql" value="true" />        </properties>    </persistence-unit></persistence>

三、SQLite作為Hibernate的數據源1.Maven配置文件:pom.xml用MyEclipse新建一個Maven的模塊app1.module1配置它的pom文件:/module1/pom.xml

引入JPA的依賴:http://hibernate.org/orm/downloads/

<!-- for JPA, use hibernate-entitymanager instead of hibernate-core --><dependency>  <groupId>org.hibernate</groupId>  <artifactId>hibernate-entitymanager</artifactId>  <version>4.3.6.Final</version></dependency>

sqlite-jdbc引入sqlite的依賴:http://www.mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.7.2

<dependency>  <groupId>org.xerial</groupId>  <artifactId>sqlite-jdbc</artifactId>  <version>3.7.2</version></dependency>

處理報錯:ArtifactTransferException: Failure to transfer org.xerial:sqlite-jdbc:jar:3.7.2 from http://zhanghua.1199.blog.163.com/blog/static/464498072013529936189/

對于這個包從maven中心傳輸到本地倉庫失敗,決定不會重新嘗試下載jar包,直到mavne再改更新索引,或強制更新。實際的解決辦法是:直接去本地倉庫,把這個1.1.1的目錄刪除掉(因為包沒有下載下來),再次刷新你的項目就中以了,或者在你的項目上右擊,選擇maven--->update就可以了,讓maven重新下載。

刪除D:/Idea/maven/repository/org/xerial文件

/module1/pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>yuki.jpa.hibernate.app1</groupId>    <artifactId>module1</artifactId>    <version>0.0.1-SNAPSHOT</version>    <packaging>jar</packaging>    <name>module1</name>    <url>http://maven.apache.org</url>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    </properties>    <dependencies>        <dependency>            <groupId>junit</groupId>            <artifactId>junit</artifactId>            <version>4.11</version>            <scope>test</scope>        </dependency>        <!-- for JPA, use hibernate-entitymanager instead of hibernate-core -->        <dependency>            <groupId>org.hibernate</groupId>            <artifactId>hibernate-entitymanager</artifactId>            <version>4.3.6.Final</version>        </dependency>        <dependency>            <groupId>org.xerial</groupId>            <artifactId>sqlite-jdbc</artifactId>            <version>3.7.2</version>        </dependency>    </dependencies></project>

2.JPA的配置文件:persistence.xmlD:/Workspaces/IntelliJ_IDEA/JavaEE_JPA/Module1/src/main/resources/META-INF/persistence.xml在這里,需要配置數據源,數據源的位置是sqlite的db文件的位置D:/Database/sqlite/test1.db數據源的用戶名和密碼是空字符串就可以了

/module1/src/main/java/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?><persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence                         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd ">    <persistence-unit name="module1" transaction-type="RESOURCE_LOCAL">        <class>yuki.jpa.hibernate.app1.module1.bean.Person</class>        <properties>            <property name="hibernate.dialect" value="com.applerao.hibernatesqlite.dialect.SQLiteDialect" />            <property name="hibernate.hbm2ddl.auto" value="update" />            <property name="hibernate.connection.driver_class" value="org.sqlite.JDBC" />            <property name="hibernate.connection.url" value="jdbc:sqlite://D:/Database/sqlite/test1.db" />            <property name="hibernate.connection.username" value="" />            <property name="hibernate.connection.passWord" value="" />            <property name="hibernate.show_sql" value="true" />        </properties>    </persistence-unit></persistence>

3.SQLite的hibernate方言復制代碼:https://code.google.com/p/hibernate-sqlite/source/browse/trunk/source/src/main/java/com/applerao/hibernatesqlite/dialect/SQLiteDialect.java?r=24修改報錯內容:http://www.myexception.cn/open-source/1120141.html

hibernate4 替代hibernate3 的Hibernate.INTEGER的用法hibernate3 中沒有了Hibernate.INTEGER的用法在Hibernate4中使用的方法是 StandardBasicTypes.INTEGER用法例如:sqlQuery.addScalar("id",StandardBasicTypes.INTEGER);

/module1/src/main/java/com/applerao/hibernatesqlite/dialect/SQLiteDialect.java

package com.applerao.hibernatesqlite.dialect;/** * https://code.google.com/p/hibernate-sqlite/source/browse/trunk/source/src/main/java/com/applerao/hibernatesqlite/dialect/SQLiteDialect.java?r=24 * http://www.myexception.cn/open-source/1120141.html *  *//* * The author disclaims copyright to this source code. In place of * a legal notice, here is a blessing: *  * May you do good and not evil. * May you find forgiveness for yourself and forgive others. * May you share freely, never taking more than you give. * */import java.sql.Types;import org.hibernate.dialect.Dialect;import org.hibernate.dialect.function.SQLFunctionTemplate;import org.hibernate.dialect.function.StandardSQLFunction;import org.hibernate.dialect.function.VarArgsSQLFunction;import org.hibernate.type.StandardBasicTypes;public class SQLiteDialect extends Dialect {    public SQLiteDialect() {        super();        registerColumnType(Types.BIT, "integer");        registerColumnType(Types.TINYINT, "tinyint");        registerColumnType(Types.SMALLINT, "smallint");        registerColumnType(Types.INTEGER, "integer");        registerColumnType(Types.BIGINT, "bigint");        registerColumnType(Types.FLOAT, "float");        registerColumnType(Types.REAL, "real");        registerColumnType(Types.DOUBLE, "double");        registerColumnType(Types.NUMERIC, "numeric");        registerColumnType(Types.DECIMAL, "decimal");        registerColumnType(Types.CHAR, "char");        registerColumnType(Types.VARCHAR, "varchar");        registerColumnType(Types.LONGVARCHAR, "longvarchar");        registerColumnType(Types.DATE, "date");        registerColumnType(Types.TIME, "time");        registerColumnType(Types.TIMESTAMP, "timestamp");        registerColumnType(Types.BINARY, "blob");        registerColumnType(Types.VARBINARY, "blob");        registerColumnType(Types.LONGVARBINARY, "blob");        // registerColumnType(Types.NULL, "null");        registerColumnType(Types.BLOB, "blob");        registerColumnType(Types.CLOB, "clob");        registerColumnType(Types.BOOLEAN, "integer");        registerFunction("concat", new VarArgsSQLFunction(StandardBasicTypes.STRING, "", "||", ""));        registerFunction("mod", new SQLFunctionTemplate(StandardBasicTypes.INTEGER, "?1 % ?2"));        registerFunction("substr", new StandardSQLFunction("substr", StandardBasicTypes.STRING));        registerFunction("substring", new StandardSQLFunction("substr", StandardBasicTypes.STRING));    }    public boolean supportsIdentityColumns() {        return true;    }    /*     * public boolean supportsInsertSelectIdentity() { return true; // As     * specify in NHibernate dialect }     */    public boolean hasDataTypeInIdentityColumn() {        return false; // As specify in NHibernate dialect    }    /*     * public String appendIdentitySelectToInsert(String insertString) { return     * new StringBuffer(insertString.length()+30). // As specify in NHibernate     * dialect append(insertString).     * append("; ").append(getIdentitySelectString()). toString(); }     */    public String getIdentityColumnString() {        // return "integer primary key autoincrement";        return "integer";    }    public String getIdentitySelectString() {        return "select last_insert_rowid()";    }    public boolean supportsLimit() {        return true;    }    public String getLimitString(String query, boolean hasOffset) {        return new StringBuffer(query.length() + 20).append(query).append(hasOffset ? " limit ? offset ?" : " limit ?").toString();    }    public boolean supportsTemporaryTables() {        return true;    }    public String getCreateTemporaryTableString() {        return "create temporary table if not exists";    }    public boolean dropTemporaryTableAfterUse() {        return false;    }    public boolean supportsCurrentTimestampSelection() {        return true;    }    public boolean isCurrentTimestampSelectStringCallable() {        return false;    }    public String getCurrentTimestampSelectString() {        return "select current_timestamp";    }    public boolean supportsUnionAll() {        return true;    }    public boolean hasAlterTable() {        return false; // As specify in NHibernate dialect    }    public boolean dropConstraints() {        return false;    }    public String getAddColumnString() {        return "add column";    }    public String getForUpdateString() {        return "";    }    public boolean supportsOuterJoinForUpdate() {        return false;    }    public String getDropForeignKeyString() {        throw new UnsupportedOperationException("No drop foreign key syntax supported by SQLiteDialect");    }    public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) {        throw new UnsupportedOperationException("No add foreign key syntax supported by SQLiteDialect");    }    public String getAddPrimaryKeyConstraintString(String constraintName) {        throw new UnsupportedOperationException("No add primary key syntax supported by SQLiteDialect");    }    public boolean supportsIfExistsBeforeTableName() {        return true;    }    public boolean supportsCascadeDelete() {        return false;    }}

4.設置設置程序關聯:控制面板/所有控制面板項/默認程序/設置默認程序/設置程序關聯設置XML格式化代碼時不換行:MyEclipse>FilesAndEditors>XML>XML Source>Linewidth=很大的值設置JAVA格式化代碼時不換行:Java>CodeStyle>Formatter>New…>LineWrapping>SettingsForAnnotation>選擇上面的選項>LineWrapPolicy=DoNotWrap

5.異常處理

沒有持久化的提供者報錯:javax.persistence.PersistenceException: No Persistence provider for EntityManager named module1解決:http://stackoverflow.com/questions/21975553/javax-persistence-persistenceexception-no-persistence-provider-for-entitymanage

If you're doing this from a JUnit test, and using maven,the persistence.xml should be located in src/test/resources/META-INF/persistence.xmlwhich will be put into the correct location at test execution time.The file in src/main/resources/META-INF/ is not used as it is not in the test-jar's path.

執行maven clean之后

執行maven clean后會刪除運行處的persistence.xml,可以刪除再添加persistence.xml,來使persistence.xml在運行的文件夾下

四、JPA實體1.自動建表<property name="hibernate.hbm2ddl.auto" value="update" />http://www.companysz.com/talo/articles/1662244.html

validate    加載hibernate時,驗證創建數據庫表結構create     每次加載hibernate,重新創建數據庫表結構,這就是導致數據庫表數據丟失的原因。create-drop  加載hibernate時創建,退出是刪除表結構update     加載hibernate自動更新數據庫結構

需要建表的類Person.java添加注解Entity,被 @Entity注解的類就是JPA的實體類,主鍵注解 @Id, @GeneratedValuehttp://andyj.VEvb.com/blog/287827

IDENTITY:   表自增鍵字段,Oracle不支持這種方式AUTO:     JPA自動選擇合適的策略,是默認選項SEQUENCE:  通過序列產生主鍵,通過 @SequenceGenerator注解指定序列名,MySql不支持這種方式TABLE:     通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person1.txt

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;@Entitypublic class Person {    private Integer id;    private String name;    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    // @GeneratedValue (strategy=GenerationType.AUTO)    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

測試類PersonTest.java

獲取實體管理器工廠,獲取實體管理器,開啟事務,保存,提交事務,關閉實體管理器,關閉實體管理器工廠

/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest1

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void save() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager manager = factory.createEntityManager();        manager.getTransaction().begin();        manager.persist(new Person("person1"));        manager.getTransaction().commit();        manager.close();        factory.close();    }    }

刷新SQliteExpert中的數據庫,看到新建的表和保存的數據

2.實體類的注解

自定義表名    @Table(name="xxxPerson")自定義列的屬性  @Column(length=10, nullable=false, name="personName")

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person2.txt

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="xxxPerson")public class Person {    private Integer id;    private String name;    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    @Column(length=10, nullable=false, name="personName")    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

刪除Person表,再次測試

日期類型  @Temporal(TemporalType.DATE)枚舉類型  @Enumerated(EnumType.STRING)

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person3.txt

package yuki.jpa.hibernate.app1.module1.bean;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Temporal;import javax.persistence.TemporalType;@Entitypublic class Person {    private Integer id;    private String name;    private Date birthday; //1987-12-10    private Gender gender = Gender.MAN; //默認值為MAN    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    @Column(length=10, nullable=false)    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @Temporal(TemporalType.DATE)    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        @Enumerated(EnumType.STRING)    @Column(length=5, nullable=false/*保存枚舉值要設置數據庫的字段不能為空*/)     public Gender getGender() {        return gender;    }    public void setGender(Gender gender) {        this.gender = gender;    }}

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/Gender.java

package yuki.jpa.hibernate.app1.module1.bean;public enum Gender {    MAN,WOMEN}

刪除Person表,再次測試

文件或大文本數據  @Lob

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person4.txt

package yuki.jpa.hibernate.app1.module1.bean;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Lob;import javax.persistence.Temporal;import javax.persistence.TemporalType;@Entitypublic class Person {    private Integer id;    private String name;    private Date birthday; //1987-12-10    private Gender gender = Gender.MAN; //默認值為MAN    private String info; //存放大文本數據    private byte[] file; //存放文件    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    @Column(length=10, nullable=false)    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @Temporal(TemporalType.DATE)    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        @Enumerated(EnumType.STRING)    @Column(length=5, nullable=false/*保存枚舉值要設置數據庫的字段不能為空*/)     public Gender getGender() {        return gender;    }    public void setGender(Gender gender) {        this.gender = gender;    }        @Lob    public String getInfo() {        return info;    }    public void setInfo(String info) {        this.info = info;    }        @Lob    public byte[] getFile() {        return file;    }    public void setFile(byte[] file) {        this.file = file;    }}

延遲加載       @Basic(fetch=FetchType.LAZY)不持久化的字段   @Transient

/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person5.txt

package yuki.jpa.hibernate.app1.module1.bean;import java.util.Date;import javax.persistence.Basic;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Lob;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;@Entitypublic class Person {    private Integer id;    private String name;    private Date birthday; //1987-12-10    private Gender gender = Gender.MAN; //默認值為MAN    private String info; //存放大文本    private byte[] file; //存放大文件,延遲加載    private String imagePath; //不持久化的字段    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    @Column(length=10, nullable=false)    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @Temporal(TemporalType.DATE)    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        @Enumerated(EnumType.STRING)    @Column(length=5, nullable=false/*保存枚舉值要設置數據庫的字段不能為空*/)     public Gender getGender() {        return gender;    }    public void setGender(Gender gender) {        this.gender = gender;    }        @Lob    public String getInfo() {        return info;    }    public void setInfo(String info) {        this.info = info;    }        @Lob    @Basic(fetch=FetchType.LAZY) //訪問這個屬性的時候才會加載進內存    public byte[] getFile() {        return file;    }    public void setFile(byte[] file) {        this.file = file;    }        @Transient    public String getImagePath() {        return imagePath;    }    public void setImagePath(String imagePath) {        this.imagePath = imagePath;    }}

下面使用的實體類/module1/src/main/java/yuki/jpa/hibernate/app1/module1/bean/person/Person7

package yuki.jpa.hibernate.app1.module1.bean;import java.util.Date;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.EnumType;import javax.persistence.Enumerated;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.Temporal;import javax.persistence.TemporalType;import javax.persistence.Transient;@Entitypublic class Person {    private Integer id;    private String name;    private Date birthday; //1987-12-10    private Gender gender = Gender.MAN; //默認值為MAN    private String imagePath; //不持久化的字段    public Person() {}    public Person(String name) {        this.name = name;    }    @Id    @GeneratedValue    public Integer getId() {        return id;    }    public void setId(Integer id) {        this.id = id;    }    @Column(length=10, nullable=false)    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }        @Temporal(TemporalType.DATE)    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }        @Enumerated(EnumType.STRING)    @Column(length=5, nullable=false/*保存枚舉值要設置數據庫的字段不能為空*/)     public Gender getGender() {        return gender;    }    public void setGender(Gender gender) {        this.gender = gender;    }        @Transient    public String getImagePath() {        return imagePath;    }    public void setImagePath(String imagePath) {        this.imagePath = imagePath;    }        @Override    public String toString() {        return "Person [id=" + id + ", name=" + name + ", birthday=" + birthday + ", gender=" + gender + ", imagePath=" + imagePath + "]";    }}

3.對實體類的查找/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest2

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {        @Test    public void getPerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = factory.createEntityManager();//        em.getTransaction().begin();        Person person = em.find(Person.class, 1);        System.out.println(person);//        em.getTransaction().commit();        em.close();        factory.close();    }}
Hibernate: select person0_.id as id1_0_0_, person0_.birthday as birthday2_0_0_, person0_.gender as gender3_0_0_, person0_.name as name4_0_0_ from Person person0_ where person0_.id=?Person [id=1, name=person1, birthday=null, gender=MAN, imagePath=null]

.find和.getReference/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest4

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void getPerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = factory.createEntityManager();//        Person person = em.find(Person.class, 1); //相當于hibernate的get        Person person = em.getReference(Person.class, 1); //相當于hibernate的load//        load之后返回的是代理對象,使用的是cglib動態創建字節碼的技術//        如果不訪問數據,是不回發生數據的加載行為的//        org.hibernate.LazyInitializationException: could not initialize proxy - no session        em.close();        System.out.println(person.getName());        factory.close();    }    }
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 2.712 sec <<< FAILURE!getPerson(yuki.jpa.hibernate.app1.module1.bean.PersonTest) Time elapsed: 2.613 sec <<< ERROR!org.hibernate.LazyInitializationException: could not initialize proxy - no Session

異常在訪問引用對象的屬性時就會發生,即使實體管理器沒有關閉/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest5

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void getPerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = factory.createEntityManager();        /*Person person = em.find(Person.class, 2);//null        Person person = em.getReference(Person.class, 2);//javax.persistence.EntityNotFoundException        System.out.println(person);*/        Person person = em.getReference(Person.class, 2);        System.out.println(person.getName()); //這里出現了異常        em.close();        factory.close();    }    }
at yuki.jpa.hibernate.app1.module1.bean.Person_$$_jvst586_0.getName(Person_$$_jvst586_0.java)at yuki.jpa.hibernate.app1.module1.bean.PersonTest.getPerson(PersonTest.java:19)

4.JPA實體的四種狀態

new(新建)、managed(托管)、游離(脫管)、刪除當一個對象與事務關聯且進入托管狀態時對屬性進行更新,對應的數據就會同步到數據庫對象的屬性發生更改后,會放進jdbc的批提交里去

/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest6

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void updatePerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = factory.createEntityManager();        em.getTransaction().begin();                Person person = em.find(Person.class, 2);        person.setName("老張");                em.getTransaction().commit();        em.close();        factory.close();                /**         * JPA對象的四種狀態         * new(新建)         * managed(托管)         * 游離(脫管)         * 刪除         *          * 當一個對象與事務關聯且進入托管狀態時,         * 對屬性進行更新,對應的數據就會同步到數據庫         * 對象的屬性發生更改后,會放進jdbc的批提交里去         *          */    }    }

把實體管理器中的所有實體變成游離對象   .clear()把游離對象同步回數據庫         .merge(person)

/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest7

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void updatePerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = factory.createEntityManager();        em.getTransaction().begin();                Person person = em.find(Person.class, 2);        em.clear(); //把實體管理器中的所有實體變成游離對象        person.setName("老黎");        em.merge(person); //把游離對象同步回數據庫                em.getTransaction().commit();        em.close();        factory.close();    }    }

刪除實體/module1/src/test/java/yuki/jpa/hibernate/app1/module1/bean/personTest/PersonTest8

package yuki.jpa.hibernate.app1.module1.bean;import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence;import org.junit.Test;public class PersonTest {    @Test    public void deletePerson() {        EntityManagerFactory factory = Persistence.createEntityManagerFactory("module1");        EntityManager em = fa
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美日韩亚洲成人 | 精品一区二区三区中文字幕老牛 | 午夜视频你懂的 | 中文字幕在线免费 | 国产一级一级 | 亚洲视频在线免费看 | 欧美视频一区二区三区四区 | 欧美视频99 | 毛片在线免费播放 | 亚洲性生活免费视频 | 欧美精品一区二区三区在线播放 | 亚洲精品一区二区三区大胸 | 99精品视频一区二区 | 免费一级片网站 | 91精品国产乱码久久久久久久久 | 国产一区日韩精品 | 日本免费一区二区三区四区 | 毛片天天看 | 久久精品99国产国产精 | 免费毛片视频播放 | 91小视频在线观看免费版高清 | 一区二区三区在线观看国产 | 国产手机在线视频 | 久久国产午夜 | 黑人一区二区三区四区五区 | 成人做爰高潮片免费视频韩国 | 久久草草亚洲蜜桃臀 | 72pao成人国产永久免费视频 | 在线视频 亚洲 | 成人国产精品一区二区毛片在线 | 欧美日韩在线视频一区 | 欧美成人一级片 | 九九久久视频 | 中文字幕一区久久 | 黄色高清视频网站 | 7777视频 | 欧美精品一区二区三区在线 | 国产91久久久久 | 久久网站热最新地址 | 国产免费福利视频 | 成人午夜视频在线观看免费 |