国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
JPA學(xué)習(xí)筆記

JPA學(xué)習(xí)筆記

目錄
目錄 1
一、JPA基礎(chǔ) 2
1.1 JPA基礎(chǔ) 2
1.2JPA開(kāi)發(fā)過(guò)程 3
1.3 實(shí)體的生命周期及實(shí)體管理器常用方法 4
二、環(huán)境搭建 5
2.1 添加JPA支持 6
2.2 添加配置文件 6
2.3測(cè)試配置 6
2.4 環(huán)境搭建附表 6
三、常用注解 12
3.1 批注完全參考 12
3.2 ID相關(guān)的 12
3.3主鍵生成策略 13
3.4字段、添加字段、添加表關(guān)聯(lián) 13
3.5映射相關(guān) 14
3.6其他 14
四、JPA映射 14
4.1一對(duì)一映射 15
4.1.1共享主鍵映射 15
4.1.2關(guān)聯(lián)外鍵映射 17
4.1.3添加表關(guān)聯(lián) 17
4.2一對(duì)多關(guān)聯(lián) 18
4.2.1添加字段的一對(duì)多、多對(duì)一關(guān)聯(lián) 18
4.2.2添加表的一對(duì)多、多對(duì)一關(guān)聯(lián) 19
4.3多對(duì)多關(guān)聯(lián) 20
4.4繼承映射 21
五、JPQL 21
六、常見(jiàn)異常 22

 

 

 

 

一、JPA基礎(chǔ)
1.1 JPA基礎(chǔ)
JPA: java persistence api 支持XML、JDK5.0注解倆種元數(shù)據(jù)的形式,是SUN公司引入的JPA ORM規(guī)范


元數(shù)據(jù):對(duì)象和表之間的映射關(guān)系


實(shí)體: entity,需要使用Javax.persistence.Entity注解或xml映射,需要無(wú)參構(gòu)造函數(shù),類(lèi)和相關(guān)字段不能使用final關(guān)鍵字
 游離狀態(tài)實(shí)體以值方式進(jìn)行傳遞,需要serializable


JPA是一套規(guī)范、有很多框架支持(如Hibernate3.2以上、Toplink,一般用Hibernate就行 oracle可以用toplink)
  
 JPQL
 1、與數(shù)據(jù)庫(kù)無(wú)關(guān)的,基于實(shí)體的查詢語(yǔ)言
 2、操作的是抽象持久化模型
 3、JPQL是一種強(qiáng)類(lèi)型語(yǔ)言,一個(gè)JPQL語(yǔ)句中每個(gè)表達(dá)式都有類(lèi)型 
 4、EJBQL的擴(kuò)展
 5、支持projection(可以查詢某個(gè)實(shí)體的字段而不需要查詢整個(gè)實(shí)體)、批量操作(update、delete)、子查詢、join、group by having(group by聚合后 having 聚合函數(shù) 比較 條件)
 
 
 弱類(lèi)型語(yǔ)言:沒(méi)有明顯的類(lèi)型、根據(jù)情況變化、容易出錯(cuò)
 強(qiáng)類(lèi)型語(yǔ)言:沒(méi)個(gè)變量都有固定的類(lèi)型。不容易出錯(cuò)
 
 
 雖然JPA規(guī)范中明確表示無(wú)法訪問(wèn)一個(gè)集合關(guān)系字段
 
 抽象模型類(lèi)型:JPQL規(guī)范將一個(gè)實(shí)體(屬性)中所飲食的各種類(lèi)型稱為抽象模型類(lèi)型
  狀態(tài)字段
  關(guān)聯(lián)字段
  
 查詢多個(gè)字段查出來(lái)的是個(gè)對(duì)象值數(shù)組
1.2JPA開(kāi)發(fā)過(guò)程
 JPA配置文件聲明持久化單元 --> 配置文件persistence.xml
 編寫(xiě)帶標(biāo)注的實(shí)體類(lèi)
 編寫(xiě)Dao類(lèi)
 
 
 
xml配置
 
 事務(wù)類(lèi)型分為:RESOURCE_LOCAL
本地事務(wù)、JTA(java事務(wù)API)
 
 注解
  @Entity  將JavaBean標(biāo)注為一個(gè)實(shí)體 name屬性
  @Table  數(shù)據(jù)庫(kù)中的表,name名稱、catalog數(shù)據(jù)庫(kù)名 @Secondary Table/@Secondary Tables多個(gè)表
  @Id   定義了實(shí)體的主鍵信息
  @GeneratedValue逐漸省城策略
     @GeneratedValue(Strategy = GenerationType.SEQUENCE)
     @SequenceGenerator(name="SEQ_TEST",sequenceName="User_SEQ",allocationSize=25)
  @column  屬性、字段對(duì)應(yīng)的表字段
  @Temporal 屬性是時(shí)間類(lèi)型的話可以細(xì)分
     DATE  java.sql.Date
     TIME  java.sql.Time 
     TIMESTAMP java.sql.Timestamp
  @Lob  標(biāo)注CLOB、BLOB
  @Base 是否延遲加載@Base(fetch = FETCHTYPE.LAZY/FETCHTYPE.EAGER) 
  @Transient 實(shí)體bean中,所有非static、非transient狀態(tài)變量、字段都要被持久化
     如果有字段、變量在數(shù)據(jù)庫(kù)中沒(méi)有對(duì)應(yīng),標(biāo)注為transient就可以不被持久化
  標(biāo)注方式: 標(biāo)注在字段上
     標(biāo)注在變量上
  
 實(shí)體類(lèi)寫(xiě)法:
  1、必須有無(wú)參的構(gòu)造函數(shù)
  2、沒(méi)有final類(lèi)型的變量或方法
  3、不可以是public類(lèi)型的,只能通過(guò)get、set方法讀寫(xiě)
  
 管理實(shí)體
  Persistence
  EntityManagerFactory
  EntityManager
  
  Persistence.createEntityManagerFactory('persistence.xml中配置的persistence unit').createEntityManager()獲取EntityManager
  
1.3 實(shí)體的生命周期及實(shí)體管理器常用方法  
  EntityManager聲明周期    Java對(duì)象   實(shí)體管理器    數(shù)據(jù)庫(kù)
   1、 新實(shí)體(new)     存在    不存在     不存在    
   2、持久化實(shí)體(managed)   存在    存在     存在
   3、分離的實(shí)體(detached)   不存在    不存在     存在
   4、刪除的實(shí)體(removed)   存在    存在     不存在
   
   
        new  
        ↓persist()  
     find()  ↓  commit()、clear()
    DB  → → → → → → managed  → → → → → → detached
        ↓   ←merge()
        ↓   
        ↓remove()
        removed
   常用方法
   1、persist(Object)       持久化
   2、remove(Object)       刪除對(duì)象
   3、find(Class entityClass,Object key)  根據(jù)主鍵查詢
   4、flush()         實(shí)體與底層同步,執(zhí)行sql
   5、createQuery()       創(chuàng)建JPQL查詢對(duì)象
   5、createNativeQuery()      根據(jù)普通SQL查詢
   5、createNamedQuery()      命名查詢@NamedQuerie標(biāo)注 
   5、merge(Object)       將一個(gè)detached的實(shí)體持久化到EntityManager中
   5、close()         關(guān)閉管理器
———————————————————————————————————————
javax.persistence.Query   
int executeUpdate()   執(zhí)行更新、刪除、添加
Object getSingleResult() 執(zhí)行查詢(返回一條記錄) 
List getResultList()  執(zhí)行查詢(返回結(jié)果鏈表)
Query setParameter(int position,object value) 給Query對(duì)象設(shè)置參數(shù)
Query setMaxResults(int maxResult)    給Query對(duì)象設(shè)置返回?cái)?shù)
Query setFirstResult(int firstResult)  給Query對(duì)象設(shè)置返回偏移
    
    
參數(shù)查詢(只能用一種)
     命名參數(shù)查詢 "select u from User where id = :uid";  setParameter("uid",value);
     位置參數(shù)查詢

------------------------------------------------------------

Person person = em.find(Person.class,1);
//相當(dāng)于Hibernate的get
Person person = em.getReference(Person.class,1);  
//相當(dāng)于Hibernate的load返回一個(gè)代理對(duì)象
   //注意延遲加載時(shí)的 事務(wù)沒(méi)關(guān)閉的時(shí)候才好用

find 如果找不到返回的是個(gè)null,這時(shí)候下面在調(diào)用null的方法報(bào)nullpoint異常
reference相當(dāng)于延遲加載  如果找不到,會(huì)在第一次使用就報(bào)EntityNotFound異常
     
  回調(diào)函數(shù)(相當(dāng)于攔截器,下面的方法執(zhí)行前后調(diào)用指定的方法)     
    @Prepersist      
    @PostPersist
    @PreRemove
    @PostRemove
    @PreUpdate
    @PostUpdate
    @PostLoad    載入實(shí)體時(shí)(find、查詢、refresh)

-----------------------------------------------------------------
二、環(huán)境搭建
2.1 添加JPA支持
1、準(zhǔn)備JPA用到的jar包(JPA支持包)
2、window → preferences → Java → BuildPath → User Libraries
    →new  User Library
    →Add  Jars

3、項(xiàng)目   → 右鍵 → properties(alt+Enter)
→ Java Build Path  → Libraries
    → Add Library  → User Library  → 自己定義的JPA支持包

2.2 添加配置文件
 1、項(xiàng)目中SRC目錄下添加META-INF目錄(與Web項(xiàng)目下META-INF同名)
 2、在新添加的META-INF中添加配置文件persistences.xml
  persistence.xml配置信息 (Hibernate)
  數(shù)據(jù)庫(kù)連接信息查詢
  主要配置信息:
   事務(wù)類(lèi)型:本地事務(wù)、JTA事務(wù)
JPA供應(yīng)商
  數(shù)據(jù)庫(kù)驅(qū)動(dòng)、URL、User、Password
 3、在SRC目錄下添加log4j.properties文件(顯示數(shù)據(jù)庫(kù)操作信息的)


2.3測(cè)試配置
 1、MySQL測(cè)試數(shù)據(jù)庫(kù)
  2、實(shí)體注解
 3、JUNIT測(cè)試方法

 

 


2.4 環(huán)境搭建附表

persistence.xml配置信息
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence  <!-- name="持久化單元命名"  transaction-type="本地事務(wù)/JTA" -->
 <persistence-unit name="JPA" transaction-type="RESOURCE_LOCAL">
  <!-- 供應(yīng)商 -->
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  
  
  <properties>
   <!-- 參數(shù):數(shù)據(jù)庫(kù)驅(qū)動(dòng)名、地址、用戶、密碼、方言、顯示執(zhí)行SQL語(yǔ)句 -->
   <property name="hibernate.connection.driver_class" value=""/>
   <property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver"/>
   <property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/JPA"/>
   <property name="hibernate.connection.username" value="root"/>
   <property name="hibernate.connection.password" value="123456"/>
   <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
   <property name="hibernate.show_sql" value="true"/>
   
   <!-- 其他設(shè)置 -->
   <property name="minPoolSize" value="5"/>
   <property name="initialPoolSize" value="10"/>
   <property name="idleConnectionTestPeriod" value="120"/>
   <property name="acquireIncrement" value="10"/>
   <property name="checkoutTimeout" value="3600"/>
   <property name="numHelperThreads" value="4"/>
   <property name="maxStatements" value="400"/>
   <property name="maxStatementsPerConnection" value="20"/>
   <property name="maxIdleTime" value="180"/>
   <property name="acquireRetryAttempts" value="30"/>
   <property name="maxPoolSize" value="200"/>
  
  </properties>
 </persistence-unit>
</persistence>

自動(dòng)創(chuàng)建|更新|驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)。如果不是此方面的需求建議set value="none"。
容易造成數(shù)據(jù)丟失,一般在測(cè)試的時(shí)候才用

<property name="hibernate.hbm2ddl.auto" value="create"></property>、validate  驗(yàn)證數(shù)據(jù)庫(kù)表結(jié)構(gòu)
create  每次加載Hibernate都會(huì)刪除上一次的表結(jié)構(gòu),根據(jù)model重新生成
create-drop每次加載創(chuàng)建,sessionFactory關(guān)閉表就自動(dòng)刪除
update  加載Hibernate就更想你表結(jié)構(gòu)

環(huán)境測(cè)試代碼
實(shí)體注解
@Entity
@Table(name="Person")
public class Person {
 @Id
 @Column(name="pid")
 private Integer id;
 @Column(name="pname")
 private String name;
 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;
 }
 
}

JUNIT測(cè)試方法
public EntityManager testGetEM(){
  EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPA");
  EntityManager em = emf.createEntityManager();
  return em;
 }
 public void testAddPerson(){
  Person p = new Person();
  p.setId(1);
  p.setName("ader");
  EntityManager em = testGetEM();
  EntityTransaction et = em.getTransaction();
  try {
   et.begin();
   em.persist(p);
   et.commit();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

 MySQL測(cè)試數(shù)據(jù)庫(kù)
drop database if exists jpa;
create database jpa;
use jpa;
drop table if exists person;
drop table if exists  ident;
drop table if exists  rel;
create table person(
 pid int primary key auto_increment,
 pname varchar(50)
)
;
create table ident(
 iid int primary key auto_increment,
 iname varchar(50)
);
create table rel(
 personid int,
 identid int
);

 

 

JPA支持包
antlr-2.7.6.jar
cglib-2.1.3.jar
classes12.jar
commons-collections-3.1.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
ejb3-persistence.jar
hibernate3.jar
hibernate-annotations.jar
hibernate-cglib-repack-2.1_3.jar
hibernate-commons-annotations.jar
hibernate-entitymanager.jar
javassist-3.4.GA.jar
jta-1.1.jar
log4j-1.2.15.jar
persistence-api-1.0.jar
slf4j-api-1.5.2.jar
slf4j-log4j12.jar


Hibernate核心包(8個(gè)文件):hibernate-distribution-3.3.1.GA.ZIP
-----------------------------------------------------------------
hibernate3.jar
lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar (CGLIB庫(kù),Hibernate用它來(lái)實(shí)現(xiàn)PO字節(jié)碼的動(dòng)態(tài)
生成,非常核心的庫(kù),必須使用的jar包)
lib\required\*.jar
Hibernate注解包(3個(gè)文件):hibernate-annotations-3.4.0.GA.ZIP
-----------------------------------------------------------------
hibernate-annotations.jar
lib\ejb3-persistence.jar, hibernate-commons-annotations.jar
Hibernate針對(duì)JPA的實(shí)現(xiàn)包(3個(gè)文件):hibernate-entitymanager-3.4.0.GA.ZIP
-----------------------------------------------------------------
hibernate-entitymanager.jar
lib\test\log4j.jar, slf4j-log4j12.jar

 


數(shù)據(jù)庫(kù)連接信息查詢
1、Hibernate JDBC屬性
屬性名  用途
hibernate.connection.driver_class jdbc驅(qū)動(dòng)類(lèi)
hibernate.connection.url jdbc URL
hibernate.connection.username 數(shù)據(jù)庫(kù)用戶
hibernate.connection.password 數(shù)據(jù)庫(kù)用戶密碼
hibernate.dialect 數(shù)據(jù)庫(kù)方言

2、驅(qū)動(dòng)包
Db2:db2java.jar(JDBC直連)
   :db2jcc.jar(Hibernate要用到此驅(qū)動(dòng)jar文件和上面的驅(qū)動(dòng)jar文件)
sybase:jconn3d.jar
MSSQL:msbase.jar+mssqlserver.jar+msutil.jar
MySQL:mysql-connector-java-3.1.12-bin.jar
Oracle10g:ojdbc14.jar

3、連接字符串(可以先添加驅(qū)動(dòng)包然后到包里找Driver.class)
a、MSSQL
驅(qū)動(dòng):com.microsoft.jdbc.sqlserver.SQLServerDriver
地址:jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=數(shù)據(jù)庫(kù)

b、Oracle10g
驅(qū)動(dòng):oracle.jdbc.driver.OracleDriver
地址:jdbc:oracle:thin:@127.0.0.1:1521:全局標(biāo)識(shí)符

c、MySQL
驅(qū)動(dòng):org.gjt.mm.mysql.Driver
地址:jdbc:mysql://127.0.0.1:3306/數(shù)據(jù)庫(kù)

d、Access
驅(qū)動(dòng):sun.jdbc.odbc.JdbcOdbcDriver
地址:jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=c:\\demodb.mdb

e、DB2
驅(qū)動(dòng):COM.ibm.db2.jdbc.net.DB2Driver
地址:jdbc:db2://127.0.0.1:6789/demodb
4、Hibernate SQL方言 (hibernate.dialect)
RDBMS 方言
DB2 org.hibernate.dialect.DB2Dialect
DB2 AS/400 org.hibernate.dialect.DB2400Dialect
DB2 OS390 org.hibernate.dialect.DB2390Dialect
PostgreSQL org.hibernate.dialect.PostgreSQLDialect
MySQL org.hibernate.dialect.MySQLDialect
MySQL with InnoDB org.hibernate.dialect.MySQLInnoDBDialect
MySQL with MyISAM org.hibernate.dialect.MySQLMyISAMDialect
Oracle (any version) org.hibernate.dialect.OracleDialect
Oracle 9i/10g org.hibernate.dialect.Oracle9Dialect
Sybase org.hibernate.dialect.SybaseDialect
Sybase Anywhere org.hibernate.dialect.SybaseAnywhereDialect
Microsoft SQL Server org.hibernate.dialect.SQLServerDialect
SAP DB org.hibernate.dialect.SAPDBDialect
Informix org.hibernate.dialect.InformixDialect
HypersonicSQL org.hibernate.dialect.HSQLDialect
Ingres org.hibernate.dialect.IngresDialect
Progress org.hibernate.dialect.ProgressDialect
Mckoi SQL org.hibernate.dialect.MckoiDialect
Interbase org.hibernate.dialect.InterbaseDialect
Pointbase org.hibernate.dialect.PointbaseDialect
FrontBase org.hibernate.dialect.FrontbaseDialect
Firebird org.hibernate.dialect.FirebirdDialect

-----------------------------------------------------------------
三、常用注解
3.1 批注完全參考
@Entity要將 Java 類(lèi)指定為 JPA 實(shí)體,請(qǐng)使用批注
詳細(xì)信息
 
3.2 ID相關(guān)的
復(fù)合主鍵需要
1、 實(shí)現(xiàn)序列話
2、 重寫(xiě)hascode、equal方法
3、 有構(gòu)造方法
@Embeddable 復(fù)合主鍵設(shè)置可以被引用
@EmbeddedId 引用獨(dú)立復(fù)合主鍵ID
3.3主鍵生成策略
使用Hibernate的主鍵生成策略生成字符串主鍵
@Id
@GenericGenerator(name="generator",strategy="uuid")
@GeneratedValue(generator="generator")
@Column(name="id")

使用Hibernate的主鍵生成策略與其他類(lèi)共享主鍵
@Id
 @GenericGenerator(name = "generator",
             strategy = "foreign",
              parameters = {
              @Parameter(name = "property", value = "person")
            })
  @GeneratedValue(generator = "generator")
@Column(name="cid")
3.4字段、添加字段、添加表關(guān)聯(lián)
@Column 持久化字段
 可添加、可更新、可為空
 長(zhǎng)度、表名、字段名、unique是否唯一

@JoinColumn
 name 列名
referencedColumnName指向?qū)ο蟮牧忻?br>unique約束唯一
@JoinColumns多個(gè)連接的列
@JoinColumns({
@JoinColumn(name="ADDR_ID", referencedColumnName="ID"),
@JoinColumn(name="ADDR_ZIP", referencedColumnName="ZIP")
    })
@JoinTable
@JoinTable(
name="EJB_PROJ_EMP",
joinColumns=@JoinColumn(name="EMP_ID", referencedColumnName="ID"),
inverseJoinColumns=@JoinColumn(name="PROJ_ID", referencedColumnName="ID")
)

3.5映射相關(guān)
@OneToOne
@ManyToOne
@ManyToMany
cascade級(jí)聯(lián)、CURD
fetch一次性全部讀取相關(guān)對(duì)象,還是lazy加載
optional 關(guān)聯(lián)對(duì)象是否允許為空
targetEntity關(guān)聯(lián)對(duì)象


3.6其他
 排序
@OrderBy("lastname ASC", "seniority DESC")

共享主鍵
@PrimaryKeyJoinColumn

標(biāo)注為非持久話對(duì)象
@Transient
時(shí)間類(lèi)型
@Temporal(TemporalType.…………)
枚舉類(lèi)型
@Enumerated(EnumType.…………)

 

 

@Lob //聲明屬性對(duì)應(yīng)的是一個(gè)大文件數(shù)據(jù)字段。
@Basic(fetch = FetchType.LAZY) //設(shè)置為延遲加載,當(dāng)我們?cè)跀?shù)據(jù)庫(kù)中取這條記錄的時(shí)候,不會(huì)去取
-----------------------------------------------------------------
四、JPA映射
4.1一對(duì)一映射
4.1.1共享主鍵映射
 1、一端提供主鍵、一端共享主鍵
  設(shè)置生成策略generator,主鍵值gereratedValue(generator=””)
  uuid字符串ID
  foreign引用別人ID作為自己的主鍵(需要設(shè)置引用對(duì)象參數(shù))
 2、oneToOne
  targetEntity 關(guān)聯(lián)的目標(biāo)對(duì)象,是類(lèi)名.class形式
fetch   抓去策略,有關(guān)聯(lián)的一起抓去、還是lazy加載
cascade   級(jí)聯(lián)
mappedBy  本對(duì)象被映射為*(在PrimaryKeyJoinColumn的另一端)
 3、PrimaryKeyJoinColumn設(shè)置在一端即可
  name    自身字段
  referenceColumnName指向?qū)ο蟮淖侄?br> 注意:
只要一個(gè)PrimaryKeyJoinColumn,另一端的oneToOne 設(shè)置mappedBy
都只有一個(gè)
注意:
1、向共享主鍵的對(duì)象設(shè)置提供主鍵的對(duì)象,然后持久化共享主鍵對(duì)象
 2、需要設(shè)置級(jí)聯(lián)
3、共享主鍵端維護(hù)關(guān)系、提供主鍵端被維護(hù)使用mappedBy

 
Person提供主鍵
 @Id
    @GenericGenerator(name = "generator", strategy = "uuid")
    @GeneratedValue(generator = "generator")
 @Column(name="pid")
 private String id;
 
 @Column(name="pname",length=2)
 private String name;

 @OneToOne(mappedBy="person",fetch=FetchType.EAGER,targetEntity=Idcard.class)
 private Idcard idcard;

 Idcard共享主鍵
 @Id
 @GenericGenerator(name = "generator",
            strategy = "foreign",
            parameters = {
              @Parameter(name = "property", value = "person")
            })
    @GeneratedValue(generator = "generator")
 @Column(name="cid")
 private String id;
 @Column(name="cno")
 private String no;
 @OneToOne(targetEntity=Person.class,fetch=FetchType.EAGER,cascade=CascadeType.ALL)
 @PrimaryKeyJoinColumn(name="id",referencedColumnName="id")
 private Person person;

 @Id
 @GenericGenerator(name = "generator",
            strategy = "foreign",
            parameters = {
              @Parameter(name = "property", value = "person")
            })
            @GeneratedValue(generator = "generator")
 @Column(name="cid")
 private String id;
 @Column(name="cno")
 private String no;
 @OneToOne(mappedBy="idcard",fetch=FetchType.EAGER,targetEntity=Person.class)
 private Person person;


使用共享主鍵關(guān)聯(lián)
Person p = new Person();
   p.setName("ader");
   Idcard idcard = new Idcard();
   idcard.setNo("321321");
   idcard.setPerson(p);

 

 


4.1.2關(guān)聯(lián)外鍵映射
 關(guān)系的維護(hù)端
@OneToOne(級(jí)聯(lián))
 @JoinColumn(name="本表中關(guān)聯(lián)字段",referencedColumnName="指向字段")
 被維護(hù)端
@OneToOne(mappedBy=””)

關(guān)系維護(hù)端添加一個(gè)字段作為外鍵指向被維護(hù)段。被維護(hù)端聲明mappedBy
@Entity
 @Table(name="Test_Trousers")
 public class Trousers {
    @Id
    public Integer id;
    @OneToOne
    @JoinColumn(name = "zip_id")
    public TrousersZip zip;
 }

 @Entity
 @Table(name="Test_TrousersZip")
 public class TrousersZip {
    @Id
    public Integer id;
    @OneToOne(mappedBy = "zip")
    public Trousers trousers;
 }
4.1.3添加表關(guān)聯(lián)
 添加關(guān)聯(lián)表的一一關(guān)聯(lián)
 @OneToOne
 @JoinTable(name ="關(guān)聯(lián)表名稱",
  joinColumns = @JoinColumn(name="關(guān)聯(lián)本表的字段"),
  inverseJoinColumns = @JoinColumn(name="要關(guān)聯(lián)的表的字段")
 )
 @Entity
 @Table(name="Test_People")
 public class People {
    @Id
    public Integer id;
    @OneToOne
    @JoinTable(name ="TestPeoplePassports",
      joinColumns = @JoinColumn(name="perple_fk"),
      inverseJoinColumns = @JoinColumn(name="passport_fk")
    )
    public Passport passport;
 }

 @Entity
 @Table(name="Test_Passport")
 public class Passport {
    @Id
    public Integer id;
    @OneToOne(mappedBy = "passport")
    public People people;
 }

 

4.2一對(duì)多關(guān)聯(lián)
  
  我們維護(hù)的多是他們的關(guān)系 而不是實(shí)體所以建議使用添加關(guān)系表
  在多的一端:添加字段、或者添加表 設(shè)置級(jí)聯(lián)添加
  在一端: mappedBy
  用法:new一個(gè)一的一端對(duì)象  set到多的對(duì)象中,在持久化多的一端

 4.2.1添加字段的一對(duì)多、多對(duì)一關(guān)聯(lián)
 manyToOne  多對(duì)一
 oneToMany    用一個(gè)set存放對(duì)象
添加字段關(guān)聯(lián),一般是在多的一端維護(hù)關(guān)系,設(shè)置級(jí)聯(lián)。一的一端mappedBy


 @Id
 @GenericGenerator(name="t1",strategy="uuid")
 @GeneratedValue(generator="t1")
 @Column(name="cid")
 private String cid;
 @Column(name="cname")
 private String cname;
 @OneToMany(fetch=FetchType.EAGER,mappedBy="cls")
 private Set<Student> studentSet;


 @Id
 @GenericGenerator(name="t2",strategy="uuid")
 @GeneratedValue(generator="t2")
 @Column(name="id")
 private String id;
 @Column(name="name")
 private String name;
 @ManyToOne(fetch=FetchType.EAGER,cascade=CascadeType.PERSIST,targetEntity=Clas.class)
 @JoinColumn(name="classid",referencedColumnName="cid")
 private Clas cls;


4.2.2添加表的一對(duì)多、多對(duì)一關(guān)聯(lián)
 多的一端
@Id
 @GenericGenerator(name="generator",strategy="uuid")
 @GeneratedValue(generator="generator")
 @Column(name="id")
 private String id;
 @Column(name="name")
 private String name;
 @ManyToOne(targetEntity=C.class,cascade = CascadeType.PERSIST)
 @JoinTable(name="csrel",
   joinColumns=@JoinColumn(name="sid",referencedColumnName="id"),
   inverseJoinColumns=@JoinColumn(name="cid",referencedColumnName="cid")
 )
 private C c;
 一的一端
 @Id
 @GenericGenerator(name="generator",strategy="uuid")
 @GeneratedValue(generator="generator")
 @Column(name="cid")
 private String id;
 @Column(name="cname")
 private String name;
 
 @OneToMany(targetEntity=S.class,mappedBy="c")
 private Set<S> sset;


4.3多對(duì)多關(guān)聯(lián)
添加表關(guān)聯(lián)

假設(shè)Teacher 和 Student是多對(duì)多的關(guān)系,具體元數(shù)據(jù)聲明如下:
pubic class Teacher{       
@ManyToMany(targetEntity = Student.class, cascade = CascadeType.PERSIST)       
@JoinTable(table = @Table(name = "M2M_TEACHER_STUDENT"),       
joinColumns = @JoinColumn(name = "TEACHER_ID", referencedColumnName = "ID"), 
inverseJoinColumns = @JoinColumn(name = "STUDENT_ID", referencedColumnName = "ID"))       
public List<Student> getStudents() {
return students;
}                                     
}

public class Student{       
@ManyToMany(targetEntity = Teacher.class, mappedBy = "students")       
public List<Teacher> getTeachers() {              
return teachers;        }
}
************************************************
Student student = em.find(Student.class, 1);
Teacher teacher = em.getReference(Teacher.class, 1);
student.removeTeacher(teacher);
在一個(gè)事務(wù)中
************************************************


4.4繼承映射
繼承關(guān)系映射在同一張表中

@Entity
@Table(name = "customer")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "flag", discriminatorType = DiscriminatorType.STRING)
public class Customer{
}

@Entity
@DiscriminatorValue(value = "A")
public class CustomerA extends Customer{
}

@Entity
@DiscriminatorValue(value = "B")
public class CustomerB extends Customer{
}

SINGLE_TABLE:父子類(lèi)都保存到同一個(gè)表中,通過(guò)字段值進(jìn)行區(qū)分。
JOINED:父子類(lèi)相同的部分保存在同一個(gè)表中,不同的部分分開(kāi)存放,通過(guò)表連 接獲取完整數(shù)據(jù);

TABLE_PER_CLASS:每一個(gè)類(lèi)對(duì)應(yīng)自己的表,一般不推薦采用這種方式。
--------------------------------------------------------------
五、JPQL
JPQL 是一種強(qiáng)類(lèi)型語(yǔ)言,一個(gè)JPQL語(yǔ)句中每個(gè)表達(dá)式都有類(lèi)型。
  JPQL類(lèi)似Hibernate的HQL
單字段 返回具體類(lèi)型
多字段 返回多個(gè)具體類(lèi)型的數(shù)組

查詢單個(gè)字段,返回List   List<String>
查詢單個(gè)字段,返回List 只有一條記錄 還是List<String>

查詢多個(gè)字段,返回List   List<Object[]>  對(duì)象數(shù)組由多個(gè)字段值組成
查詢多個(gè)字段,返回List 只有一條記錄 還是List<Object[]>


 一條記錄getSingleResult 多條記錄
單一字段 單一值對(duì)象 List<Object>
多個(gè)字段 值對(duì)象組成的數(shù)組 List<Object[]>
實(shí)體對(duì)象 一個(gè)對(duì)象entity List<entity>

JPA操作的實(shí)體
 需要@Entity name注解
 或者是限定詞(com.sunyard.User為全稱,User為限定詞)
標(biāo)識(shí)變量
 select  u from User;   //這里u就是標(biāo)識(shí)變量
路徑表達(dá)式
 表示福報(bào) +  訪問(wèn)操作符(.) + 狀態(tài)字段/關(guān)聯(lián)字段
 狀態(tài)字段:包括一個(gè)實(shí)體不代表關(guān)聯(lián)關(guān)系的任何字段
 關(guān)聯(lián)字段:包括了實(shí)體中任何有關(guān)聯(lián)關(guān)系的字段或者屬性
參數(shù)(select u from User u where uid=?1 and uname=:name)
 ?1    位置參數(shù)setParameter(’name’,’value’)
 :name   命名參數(shù)setParameter(’name’,’value’)
 不建議在SQL語(yǔ)句中直接寫(xiě)參數(shù),防止注入。

六、常見(jiàn)異常
1、異常信息:org.hibernate.hql.ast.QuerySyntaxException: person is not mapped
 異常環(huán)境:查詢
 異常原因:查詢語(yǔ)句中Person類(lèi)沒(méi)有大寫(xiě)

2、java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.lang.String
 異常環(huán)境:查詢、遍歷顯示
 異常原因:轉(zhuǎn)型出錯(cuò)
 
3、javax.persistence.NonUniqueResultException: result returns more than one elements
 異常環(huán)境:查詢、getSingleResult
 異常原因:getSingleResult只能獲取一條數(shù)據(jù),而查詢語(yǔ)句返回的是多條數(shù)據(jù)
 
4、 org.hibernate.PropertyValueException: not-null property references a null or transient value: com.sunyard.entities.Person.name
 異常環(huán)境:數(shù)據(jù)插入
 異常原因:JPA的Entity中一個(gè)屬性定義為nullable=false,插入數(shù)據(jù)該字段為null

5、 執(zhí)行添加沒(méi)反應(yīng)、沒(méi)異常
 異常原因:沒(méi)有開(kāi)啟事務(wù)、沒(méi)有提交事務(wù)
 
6、javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.sunyard.entities.Person
 異常環(huán)境:OneToOne 共享主鍵關(guān)聯(lián)
 異常原因:一對(duì)一中,一個(gè)提供主鍵、另一個(gè)共享其主鍵,共享主鍵的對(duì)象可以set 提供主鍵的對(duì)象 然后添加到數(shù)據(jù)庫(kù)中
    方向弄反了 后果就是沒(méi)人提供主鍵
   
7、org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing:   
 異常環(huán)境:多對(duì)一添加
 異常原因:在多的一端維護(hù) ,沒(méi)有添加級(jí)聯(lián)
 
8、javax.persistence.PersistenceException: [PersistenceUnit: JPA] Unable to configure EntityManagerFactory
 異常原因:很多、實(shí)體管理器Factory沒(méi)有成功創(chuàng)建,是注解的問(wèn)題
9、org.hibernate.MappingException: Unable to find column with logical name: sid in org.hibernate.mapping.
 異常環(huán)境:添加表做多對(duì)一關(guān)聯(lián)映射
 異常原因:表字段寫(xiě)反了,name添加表字段名referencedColumnName指向本表字段名

posted on 2012-11-01 09:05 Mr.lu 閱讀(4999) 評(píng)論(1)  編輯  收藏

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
JPA環(huán)境配置
引用 Struts2+spring2.5+jpa(hibernate)+proxool
Hibernate 不同數(shù)據(jù)庫(kù)的連接及SQL方言
hibernate中的dialect設(shè)置
不同數(shù)據(jù)庫(kù)對(duì)應(yīng)的方言類(lèi)
當(dāng)全注解開(kāi)發(fā)遇到org.hibernate.MappingException: Unkno...
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服