Hibernate是一个优秀的中间层框架,关于Hibernate的资料网上上面都是很多。但觉得吧,百思不如一试,在此总结,作为知识的积累。
1.下面的实体类是关于继承的,Forum_User 继承于Person。
1.1实体类Person
public class Person {
protected int id;
protected String username;
protected String tel;
protected String address;
protected Boolean sex = true;
protected String age;
......//setter、getter方法,略...
}
1.2实体类Forum_User
public class Forum_User extends Person{
/*用户*/
protected String uesr_code;
protected String password;
private Set<Forum_Article> set;
...//略...
}
1.3 XML 映射文件,虽然现在很多项目中都应用了注解,XML配置和使用注解的优劣,就不在探究了。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping >
<class
name="com.trade.entity.domain.Person"
table="person"
dynamic-update = "true"
dynamic-insert = "true"
abstract="true"
lazy = "false"><!-- 大部分属性都是默认的,并不需要上面这样的配置,上述的配置入lazy="true"等等,都可以省略的 -->
<id name="id" column="id"
unsaved-value="null" type="int">
<generator class="increment"/><!-- 为什么用了union-subclass 之后,可以用increment而不能用identity?不解中.... -->
</id>
<property name="username" type="string" length="10"/>
<property name="tel" type="string" length="11"/>
<property name="address" type="string" length="200"/>
<property name="sex" type="boolean" column="sex" not-null="true"/>
<property name="age" type="int" length="3"/>
<union-subclass name="org.rise.entity.forum.Administractor" table = "pre_forum_Administractor">
<property name="user_code" type="string" not-null="true" length="10"/>
<many-to-one name="privilege" column="privilege_id"/>
</union-subclass>
<!-- joined-class 产生两张数据库表,一张是父类的数据库表person,单独数据库表pre_forum_user,
person表和pre_forum_user表,之间的关联是通过主键关联的
-->
<!-- union-class 只会产生一张数据库,及pre_forum_user -->
<union-subclass name = "org.rise.entity.forum.Forum_User" table = "pre_forum_user">
<property name="password" column="password" type="string" length="10" not-null="true"/>
<set name="set">
<key column="user_id"/>
<one-to-many class="org.rise.entity.forum.Forum_Article"/>
</set>
</union-subclass>
</class>
</hibernate-mapping>
1.4 测试,这里连接是mysql数据库,下面是测试类:
public class Demo {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.getTransaction();
tx.begin();
Forum_User user = new Forum_User();//实例化一个实体类对象
user.setUsername("sunflower");//一个实体类的对象 相当于数据库一条记录
user.setPassword("0000");
user.setUesr_code("ads0001");
session.save(user);
tx.commit();
}
}
1.5 数据库的表结构的查看:
2 HQL语句之inner join,left join ,right join学习
public class HQLDemo {
public static void main(String[] args) {
Session session = HibernateSessionFactory.getSession();
/**个人理解:
* Hibernate 是面向对象设计的,所有实体类的关系,应该体现在实体类上面的关联。
* 所以连接的对象应该是其属性中集合,而不同于SQL的连接。
* SQL语句的连接是这样的:SELECT P.* FROM TABLE_1 P JOIN TABLE_2 T ON P.ID=T.ID
* */
String sql_1 = "from Forum_User";//基本的HQL了
/*1 inner join,left join ,right join 和SQL语句的连接,左连接,右连接的意义不同
*2 个人理解为实体类的连接的对象是其子集合
*3 它们连接条件是id相同,on forum_user0_.id=set1_.user_id
* */
String sql_2 = "select s.title from Forum_User u inner join u.set s";//连接
String sql_3 = "from Forum_User u left join u.set s where u.username=s.title";//左连接
String sql_4 = "from Forum_User u right join u.set s where u.username=s.title";//右连接
/*fetch 个人理解为:‘抓取’的意思
* 相关资料是这样对其描述的:
* fetch连接允许选择语句将相关联的对象或者集合随着其父对象的初始化而被初始化,
* 它代替了映射文件的外连接和延迟的声明
* */
String sql_5 = "from Forum_User u join fetch u.set s";
String sql_6 = "from Forum_User u fetch all properties";
Query query = session.createQuery(sql_6);
List resList = query.list();
System.out.println("ls size: "+resList.size());
// List<String> sql_2_ls = session.createQuery(sql_2).list();
// System.out.println(sql_2_ls.get(0));
}
}