??xml version="1.0" encoding="utf-8" standalone="yes"?> Hibernate.cfg.xml配置文gQ?br />
<?xml version="1.0" encoding="utf-8"?> 数据库表主键的知识点Q?br />
Generator 为每?POJO 的实例提供唯一标识。一般情况,我们使用“native”。class 表示采用q成器接口net.sf.hibernate.id.IdentifierGenerator 实现的某个实例,其中包括Q?/p>
“assigned” “hilo” “seqhilo” “increment” “identity” “sequence” “native” “uuid.hex” “uuid.string” “foreign” 以下举例Q?br />
1、指定参数的情况Q?br />
<id name="id" unsaved-value="0"> 2、对于sql server2000中的数据库子增字D?在配|文件用下列方法实玎ͼ 3、如果表中的主键用字W串cd:可以用hibernate自己提供的方法实C键唯一: 重要的知识点: 4. 几个值得注意的问? 5. hibernate中HQL语言的查询根据你的sql的不同而返回不同的对象cd. package com.gpdi.test; import org.hibernate.Session; import com.gpdi.orm.object.Address; public class Testp { /** } } <?xml version="1.0" encoding="utf-8"?> </class> package com.gpdi.orm.object; import java.util.HashSet; public class People implements java.io.Serializable } 1、数据库l构 category表:{ categoryId , categoryName } item表:{ itemId , itemName } category_item表:{ idCategory , idItem} 2、Category.hbm.xml 3、Item.hbm.xml 4、Category.java和Item.java 映射文g中还可以不用set而用bagQ只要把set出现的地Ҏ成bagpQ这L应的category.java和Item.java 文g当中可以用List?/span>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "hibernate-configuration-2.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- properties -->
<!-- jndi -->
<property name="connection.datasource">java:comp/env/jdbc/quickstart</property>
<property name="connection.provider_class">net.sf.hibernate.connection.DatasourceConnectionProvider</property>
<property name="dialect">net.sf.hibernate.dialect.SQLServerDialect</property>
<!-- jdbc
<property name="connection.url">jdbc:microsoft:sqlserver://localhost:1433;SelectMethod=cursor;DatabaseName=pubs</property>
<property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
<property name="connection.username">sa</property>
<property name="connection.password"></property>
-->
<property name="jdbc.fetch_size">50</property><!-- 一ơ读的数据库记录?-->
<property name="jdbc.batch_size">30</property><!-- 讑֮Ҏ据库q行扚w删除 -->
<property name="show_sql">true</property><!-- Hibernate发送给数据库的sql昄出来 -->
<!-- Mapping files -->
<mapping resource="cat.hbm.xml"/>
</session-factory>
</hibernate-configuration>
主键由外部程序负责生成,?save() 之前指定一个?/p>
通过hi/lo 法实现的主键生成机Ӟ需要额外的数据库表或字D|供高位值来源?/p>
与hilo cMQ通过hi/lo 法实现的主键生成机Ӟ需要数据库中的 SequenceQ适用于支?Sequence 的数据库Q如Oracle?/p>
主键按数值顺序递增。此方式的实现机制ؓ在当前应用实例中l持一个变量,以保存着当前的最大|之后每次需要生成主键的时候将此值加1作ؓ主键。这U方式可能生的问题是:不能在集下使用?/p>
采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制?/p>
采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence?/p>
?Hibernate Ҏ使用的数据库自行判断采用 identity、hilo、sequence 其中一U作Z键生成方式?/p>
?Hibernate Z128 ?UUID 法 生成16 q制数|~码后以长度32 的字W串表示Q作Z键?/p>
与uuid.hex cMQ只是生成的主键未进行编码(长度16Q,不能应用?PostgreSQL 数据库中?/p>
使用另外一个相兌的对象的标识W作Z键?/p>
<generator class="sequence">
<param name="sequence">SEQ_CHILD</param>
</generator>
</id>
使用的是sequenceQ适合oracle数据库;
<id name="id" type="long" unsaved-value="0">
<column name="id" sql-type="numeric" not-null="true" />
<generator class="identity" />
</id>
q里主要?identity:代表由sql server2000数据库自己提供子增字D?如果要hibernate自己提供,则用increment关键字来实现
<id name="id" type="string" unsaved-value="null">
<column name="cid" sql-type="char(32)" not-null="true" />
<generator class="uuid.hex" />
</id>
使用的是uuid.hex: 采用128位的法来生成一?2位字W串。最通用的一U方式。适用于所有数据库?/p>
1. 如果有部门表,有员工表,员工表中有dep_id,则表部门cd员工cLone-to-many的关p?
可以使用: ( 在部门类department中用下?
Departmentc?
/** 部门的所有员?#160; */
private Set staffs = new TreeSet();
xml的文?
<set name="staffs" >
<key column="dep_id"/>
<one-to-many class="hbp.sys.data.Staff"/>
</set>
如果是list,需要用索引<index> </index>,具体其中的含?不是很明?待以后研I?br />
2. 如果部门要有一个负责h,即部门表(tb_department)中有一个字D?staff_id.
那么表示部门和负责h之间的关pLmany-to-one的关p?br />
Departmentc?
/** 部门负责人id */
private Staff staff;
xml 文g
<many-to-one name="staff" class="hbp.sys.data.Staff" column="staff_id"/>
3. 多对多关p?一般我们是做一个中间关联表.我用角色和权限做了个例子,
Right(id,name) Role(id,name) 中间?tb_role_right(role_id,right_id)
RightcM有一个Role的集?private Set roles=new TreeSet();
RolecM也有一个Right的集?private Set rights=new TreeSet();
则两者是明显的多对多关系.使用many-to-many来实?
xml文g?br />
right.hbm.xml:如下:
<set name="roles" table="tb_role_right" cascade="all">
<key column="right_id"/>
<many-to-many column="role_id" class="hbp.sys.data.Role"/>
</set>
role.hbm.xml文g中类?
<set name="rights" table="tb_role_right" cascade="all">
<key column="role_id"/>
<many-to-many column="right_id" class="hbp.sys.data.Right"/>
</set>
a)在xml?映射文g?写类的名字时一定用cȝ全名:??cd?(hbp.sys.data.Staff),q个错误使我费了半天?:(
b)我在写实现基本DAO操作?写了
session.delete("from Right as right where right.id="+id);
E序L报错,我折腾了半天,跟踪到底,才恍然大?hibernate在解析sql语句的时候把
其中的right,当成了数据库中的双?"保留?),?q种关键?不能随便用啊,:)
如果你用session.find(String hql)
一般会q回一个List,?from Staff staff;q回的是包含所有的员工对象的集?br />
如你的hql?select count(*) from Staff staff;则返回的是一个Integer对象
如果你用的hql?select count(distinct staff.name),count(*) from Staff staff;则返回的是一个Object
即Object[],需要先把他转换成Object[],然后在取[0],[1].
q种设计我不知道hibernate是如何处理的,感觉既好也不?好的是可以用一个find获得L查询
不好在于Ҏhql来处理返回结?Ҏ出错.
]]>
<property name="hibernate.query.factory_class">
org.hibernate.hql.classic.ClassicQueryTranslatorFactory
</property>
]]>
people表:{peopleId,name}
address表:{addressId,peopleId,addressName,codeNumber}
import com.gpdi.orm.object.People;
* @param args
*/
public static void main(String[] args)
{
People people = new People();
people.setName("linda");
Address address = new Address();
address.setAddressName("yunnan");
address.setCodeNumber("564123");
address.setPeople(people);
people.getAddresses().add(address);
Session session = HibernateSessionFactory.currentSession();
session.beginTransaction();
session.save(people);
session.getTransaction().commit();
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.gpdi.orm.object.People" table="People">
<id name="id" column="peopleId" unsaved-value="0" >
<generator class="increment">
</generator>
</id>
<property name="name" column="name"></property>
<set name="addresses" cascade="save-update">
<key column="peopleId" not-null="true" />
<one-to-many class="com.gpdi.orm.object.Address"/>
</set>
</hibernate-mapping>
import java.util.Set;
{
private long id;
private String name;
private Set addresses = new HashSet();
public Set getAddresses() {
return addresses;
}
public void setAddresses(Set addresses) {
this.addresses = addresses;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.gpdi.orm.object.Address" table="Address">
<id name="id" column="addressId" unsaved-value="0">
<generator class="increment">
</generator>
</id>
<many-to-one name="people" column="peopleId" insert="false" update="false"></many-to-one>
<property name="addressName" column="addressName"></property>
<property name="codeNumber" column="codeNumber"></property>
</class>
</hibernate-mapping>
Address.java
package com.gpdi.orm.object;
public class Address implements java.io.Serializable
{
private long id;
private People people;
private String addressName;
private String codeNumber;
public String getAddressName() {
return addressName;
}
public void setAddressName(String addressName) {
this.addressName = addressName;
}
public String getCodeNumber() {
return codeNumber;
}
public void setCodeNumber(String codeNumber) {
this.codeNumber = codeNumber;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public People getPeople() {
return people;
}
public void setPeople(People people) {
this.people = people;
}
}
下蝲例子:整理?br />
一对多的完整例?/a>
下蝲例子:整理?br />
]]>
Hibernate多对多双向关联映?
<hibernate-mapping>
<class name="com.persistent.Category" table="category">
<id name="id" column="categoryId" unsaved-value="null">
<generator class="increment"></generator>
</id>
<property name="name" column="categoryName"></property>
<set name="items" table="category_item" cascade="all" lazy="false">
<key column="idCategory"></key>
<many-to-many class="com.persistent.Item" column="idItem"></many-to-many>
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="com.persistent.Item" table="item">
<id name="id" column="itemId" unsaved-value="null">
<generator class="increment"></generator>
</id>
<property name="name" column="itemName"></property>
<set name="categories" table="category_item" lazy="false" inverse="true">
<key column="idItem"></key>
<many-to-many class="com.persistent.Category" column="idCategory"></many-to-many>
</set>
</class>
</hibernate-mapping>
public class Category {
private Long id;
private String name;
private Set items = new HashSet();
...
}
public class Item {
private Long id;
private String name;
private Set categories = new HashSet();
...
}
]]>
前期的系l创建、struts、hibernate、spring的集成工作就不用说了Q一路下?#8230;………
主要?span class="hilite1">DWR的应用,它用于表单验证:
1、先看它的配|:
Q?Q在web.xml里加上:
Q?Q再Z个类Q用于获取验证输Z息的属性文Ӟq个文g是参考了良葛??strong>DWR 入門與應用(一Q?/font>
里的Book代码
java 代码
Q?Q编写属性文?span class="hilite1">dwrPro_zh_CN.propertieQ中文)?span class="hilite1">dwr_en.propertiesQ英文)
Q?Q配|?span class="hilite1">dwr.xmlQ里面用了spring的bean 和javac?/p>
spring beanName 的value =“userManager”从applicationContext.xml里取?/p>
q里应该大家都懂Q就不罗嗦了
Q?Q配好了q些Q就可以在页面里用了
ddwr.xml?font face="Arial">userManagerQ然后读取applicationContext.xml?font face="Arial">userManager bean Q进而实?font face="Arial">findUserIsExistҎ?/font>
package com.gpdi.test;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class TestMain {
/**
* 存储一个用?br />
* @param user
*/
public void save(User user){
user.setUsername("TEST");
Card card=new Card();
//Card card1=new Card();
card.setCardnum("HGJUYT");
//card1.setCardnum("fghy55");
user.setCard(card);
//user.setCard(card1);
Session session=HibernateSessionFactory.currentSession();
card.setUser(user);
//card1.setUser(user);
Transaction tr=session.beginTransaction();
session.save(user);
//session.save(card);
tr.commit();
session.close();
}
public static void main(String[] args) throws Exception {
TestMain test=new TestMain();
test.save(new User());
}
}
Card.java
package com.gpdi.test;
/**
* Card generated by MyEclipse - Hibernate Tools
*/
public class Card implements java.io.Serializable {
// Fields
private Integer cardid;
private String cardnum;
private User user;
// Constructors
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/** default constructor */
public Card() {
}
/** full constructor */
public Card(String cardnum) {
this.cardnum = cardnum;
}
// Property accessors
public Integer getCardid() {
return this.cardid;
}
public void setCardid(Integer cardid) {
this.cardid = cardid;
}
public String getCardnum() {
return this.cardnum;
}
public void setCardnum(String cardnum) {
this.cardnum = cardnum;
}
}
User.java
package com.gpdi.test;
import java.util.HashSet;
import java.util.Set;
/**
* User generated by MyEclipse - Hibernate Tools
*/
public class User implements java.io.Serializable {
// Fields
private Integer userid;
private String username;
private Card card;
//private Set card = new HashSet();
// Constructors
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
/** default constructor */
public User() {
}
/** full constructor */
public User(String username) {
this.username = username;
}
// Property accessors
public Integer getUserid() {
return this.userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
}
HibernateSessionFactory.java
package com.gpdi.test;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;
/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution. Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html}.
*/
public class HibernateSessionFactory {
/**
* Location of hibernate.cfg.xml file.
* NOTICE: Location should be on the classpath as Hibernate uses
* #resourceAsStream style lookup for its configuration file. That
* is place the config file in a Java package - the default location
* is the default Java package.<br><br>
* Examples: <br>
* <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
* CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
*/
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
/** Holds a single instance of Session */
private static final ThreadLocal threadLocal = new ThreadLocal();
/** The single instance of hibernate configuration */
private static final Configuration cfg = new Configuration();
/** The single instance of hibernate SessionFactory */
private static org.hibernate.SessionFactory sessionFactory;
/**
* Returns the ThreadLocal Session instance. Lazy initialize
* the <code>SessionFactory</code> if needed.
*
* @return Session
* @throws HibernateException
*/
public static Session currentSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
try {
cfg.configure(CONFIG_FILE_LOCATION);
sessionFactory = cfg.buildSessionFactory();
} catch (Exception e) {
System.err
.println("%%%% Error Creating SessionFactory %%%%");
e.printStackTrace();
}
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
return session;
}
/**
* Close the single hibernate session instance.
*
* @throws HibernateException
*/
public static void closeSession() throws HibernateException {
Session session = (Session) threadLocal.get();
threadLocal.set(null);
if (session != null) {
session.close();
}
}
/**
* Default constructor.
*/
private HibernateSessionFactory() {
}
}
Card.hbm.xml