Hibernate 学习小结
一、PO的数据类型设置
int 还是Integer Integer 允许为 null
Hibernate 既可以访问Field也可以访问Property,访问Property是只是调用getXXX()、setXXX()方法,因此在from Customer where c.name=’Tom’ HQL中,name属性不需要存在,只要getName()存在就可以了。
二、Hibernate映射
1、映射复合主键
主键类Public class CustomerId implements Serializable{Private final String name;Private final String companyid;}映射文件<class name=”test.Customer” table=”CUSTOMERS”><composite-id name=”customerId” class=”test.CustomerId”><key-property name=”name” column=”NAME” type=”string”/><key-property name=”companyId” column=”COMPANY_ID” type=”long”/></composite-id><version name=”varsion” column=”VERSION” unsaved-value=”0”/><many-to-one name=”company” class=”test.Company” column=”COMPANY_ID” insert=”false” update=”false”/><set name=”orders” lazy=”true” inverse=”true”><key><column=”NAME”/><column=”COMPANY_ID”/></key></set></class><class name=”test.Order” table=”ORDERS”><many-to-one name=”customer” class=”test.Customer”><column=”NAME”/><column=”COMPANY_ID”/></many-to-one></class>或<class name=”test.Customer” table=”CUSTOMERS”><composite-id name=”customerId” class=”test.CustomerId”><key-property name=”name” column=”NAME” type=”string”/><key-many-to-one name=”company” class=”test.Company” column=”COMPANY_ID”/></composite-id><version name=”varsion” column=”VERSION” unsaved-value=”0”/><set name=”orders” lazy=”true” inverse=”true”><key><column=”NAME”/><column=”COMPANY_ID”/></key></set></class><class name=”test.Order” table=”ORDERS”><many-to-one name=”customer” class=”test.Customer”><column=”NAME”/><column=”COMPANY_ID”/></many-to-one></class><hibernate-mapping><class name=”Customer” table=”CUSTOMERS”><property /><component name=”homeAddress” class=”Address”><parent name=”customer”/><property/></component><component name=”comAddress” class=”Address”><parent name=”customer”/><property/></component></class></hibernate-mapping>Public class Customer implements Serializable{Address homeAddress;Address comAddress;}Public class Address implements Serializable{//是VO不是PO不能单独Save,也不能关联。Customer customer;}<set/idbag name=”images” table=”IMAGES” lazy=”true”><key column=”CUSTOMER_ID”/><composite-element class=”Image”><parent name=”customer”/><property/><property/></composite-element></set/idbag><map name=”images” table=”IMAGES” lazy=”true”><key column=”CUSTOMER_ID”/><index type=”string” column=”IMAGE_NAME”/><composite-element class=”Image”><parent name=”customer”/><property/><property/></composite-element></map >
DOClass{ id}ClassA extends DOClass{A1}ClassC extends ClassA{C1}ClassD extends ClassA{D1}ClassG extends ClassD{G1}ClassH extends ClassD{H1}ClassB extends DOClass{B1}ClassE extends ClassB{E1,e2,e3,e4,e5,e6}ClassF extends ClassB{F1,f2,f3,f4,f5,f6,f7}TABLE_A {ID(PK),A_TYPE(discriminator),A1,C1,D1,G1,H1}TABLE_B {ID(PK),B1}TABLE_E {B_ID(PK/FK),E1,E2,E3,E4,E5,E6}TABLE_F {B_ID(PK/FK),F1,F2,F3,F4,F5,F6,F7}ClassA.hbm.xml<hibernate-mapping><class name=”ClassA” table=”TABLE_A” discriminator-value=”A”><id/><discriminator column=”A_TYPE” type=”string”/><property name=”a1” column=”A1”/><sub-class name=”ClassC” discriminator-value=”C”><property name=”c1” column=”C1”/></sub-class><subclass name=”ClassD” discriminator-value=”D”><property name=”d1” column=”D1”/><subclass name=”ClassG” discriminator-value=”G”><property name=”g1” column=”G1”/></subclass><subclass name=”ClassH” discriminator-value=”H”><property name=”h1” column=”H1”/></subclasss></subclass></class></hibernate-mapping>ClassB.hbm.xml<hibernate-mapping><class name=”ClassB” table=”TABLE_B”><id/><property name=”b1” column=”B1”/><joined-subclass name=”ClassE” table=”TABLE_E”><key column=”B_ID”/><property name=”e1” column=”E1”/><property name=”e2” column=”E2”/><property name=”e3” column=”E3”/><property name=”e4” column=”E4”/><property name=”e5” column=”E5”/><property name=”e6” column=”E6”/></joined-subclass><joined-subclass name=”ClassF” table=”TABLE_F”><key column=”B_ID”/><property name=”f1” column=”F1”/><property name=”f2” column=”F2”/><property name=”f3” column=”F3”/><property name=”f4” column=”F4”/><property name=”f5” column=”F5”/><property name=”f6” column=”F6”/><property name=”f7” column=”F7”/></joined-subclass></class></hibernate-mapping>IMAGES{ID(PK),CUSTOMER_ID(FK),FILENAME}List images = new ArrayList();Customer.hbm.xml<idbag name=”images” table=”IMAGES” lazy=”true”><collection-id type=”long” column=”ID”><generator class=”increment”/></collection-id><key column=”CUSTOMER_ID”/><element column=”FILENAME” type=”string” not-null=”true”/></idbag>IMAGES{CUSTOMER_ID(PK/FK),POSITION(PK),FILENAME}List images = new ArrayList();Customer.hbm.xml<list name=”images” table=”IMAGES” lazy=”true”><index column=”POSITION”/><key column=”CUSTOMER_ID”/><element column=”FILENAME” type=”string” not-null=”true”/></list>IMAGES{CUSTOMER_ID(PK/FK),IMAGE_NAME(PK),FILENAME}Map images = new HashMap();<map name=”images” table=”IMAGES” lazy=”true”><key column=”CUSTOMER_ID”/><index column=”IMAGE_NAME” type=”string”/><element column=”FILENAME” type=”string” not-null=”true”/></map>Set idbag map 支持数据库排序 order by =”ID”Set map 支持内存排序 sort = “MyComparator”Public class Customer{Address homeAddress;Address comAddress;}Customer.hbm.xml<many-to-one name=”homeAddress” class=”Address” column=”HOME_ADDRESS_ID” cascade=”all” unique=”true”/><many-to-one name=”comAddress” class=”Address” column=”COM_ADDRESS_ID” cascade=”all” unique=”true”/>Address.hbm.xml<one-to-one name=”address” class=”Customer” property-ref=”homeAddress”/>Customer.hbm.xml<one-to-one name=”address” class=”Address” cascade=”all”/>Address.hbm.xml<class name=”address”><id><generator class=”foreign”><param name=”property”>customer</param></generator></id><one-to-one name=”customer” class=”Customer” constrained=”true”/></class>
<class name="Person"><id name="id" column="personId"> <generator column="addressId" not-null="true"/></class><class name="Address"><id name="id" column="addressId"><generator inverse="true"> <key column="addressId"/><one-to-many name="code"><set name=”items” table=”CATEGORY_ITEM” lazy=”true” cascade=”save-update”><key column=”CATEGORY_ID”><many-to-many class=”Item” column=”ITEM_ID”/></set>
<class name=”Category” table=”CATEGORYS”><cache usage=”read-write”/><id/><set name=”items” inverse=”true” lazy=”true”><cache usage=”read-write”/><key…/></set></class><class name=”Item”><cache usage=”read-write”/><id/></class>Hibernate.cache.provider=…………EhCacheProviderHibernate.cache.user_query_cache=trueEhcache.xml<ehcache><diskStore path=”c:\\temp”/><defaultCachemaxElementsInMemory=”10000”eternal=”false”timeToIdleSeconds=”120”timeToLiveSeconds=”120”overflowToDisk=”true”/><cache name=”Category”maxElementsInMemory=”10000”eternal=”false”timeToIdleSeconds=”120”timeToLiveSeconds=”120”overflowToDisk=”true”/><cache name=”Category.Items”maxElementsInMemory=”10000”eternal=”false”timeToIdleSeconds=”120”timeToLiveSeconds=”120”overflowToDisk=”true”/><cache name=”Item”maxElementsInMemory=”10000”eternal=”false”timeToIdleSeconds=”120”timeToLiveSeconds=”120”overflowToDisk=”true”/><cache name=”customerQueries”…./> <!—设置查询缓存?</ehcache>