主配置参数详解及复合映射,集合映射
Hibernate.cfg.xml
主配置文件中主要配置:数据库连接信息、其他参数、映射信息!
- 常用配置查看源码:
- hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
示例 :
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!--通常 , 一个session-factory节点代表一个数据库-->
<session-factory>
<!-- 1.数据库连接配置-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://192.168.5.129:3306/partner</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">mysql</property>
<!--数据库方法配置,hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 2.其他相关配置-->
<!--显示hibernate在运行时候执行sql语句-->
<property name="hibernate.show_sql">true</property>
<!--格式化sql-->
<property name="hibernate.format_sql">true</property>
<!--自动建表 hibernate.hbm2ddl.auto -->
<!--
create-drop : 每次在创建sessionFactory时候执行创建表;当创建sessionFactory的close方法的时候,删除表
create : 每次都重新建表; 如果表已经存在就先删除再创建
update : 如果表不存在就创建; 表存在就不创建
validate : (生产环境时候) 执行验证:当映射文件的内容与数据库表结构不一样的时候就报错
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 3.加载所有映射-->
<mapping resource="com/flynn/Employee.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
映射配置
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- 映射文件:映射一个实体类对象;描述一个对象最终实现可以直接保存对象数据到数据库中 -->
<!--
package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
auto-import: 默认为true, 在写hql的时候自动导入包名
如果指定为false, 再写hql的时候必须要写上类的全名;
如: session.createQuery("from com.flynn.Employee").list();
-->
<hibernate-mapping package="com.flynn" auto-import="true">
<!--
class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
name 指定要映射的对象类型
table 指定对象对应的表;
如果没有指定表名, 默认与对象名称一样
-->
<class name="Employee" table="employee">
<!--主键,映射-->
<id name="empId" column="id" type="java.lang.Integer">
<!--
主键的生成策略
api文档hibernate-distribution-3.6.0.Final/documentation/manual/zh-CN/html_single/index.html#mapping-declaration-id
identity 自增长(mysql,db2)
native 自增长(会根据底层数据库自增长的方式选择identity或sequence)
如果是mysql数据库, 采用的自增长方式是identity
如果是oracle数据库, 使用sequence序列的方式实现自增长
sequence 自增长(序列), oracle中自增长是以序列方法实现
increment 自增长(会有并发访问的问题, 一般在服务器集群环境使用会存在问题)
-->
<generator class="native"/>
</id>
<!--
普通字段的映射
property
name 指定对象的属性名称
column 指定对象属性对应的表的字段名称, 如果不写默认与对象属性一致
length 指定字符的长度, 默认为255
type 指定表的字段的类型, 如果不指定会匹配属性的类型
java类型: 必须写全名
hibernate类型: 直接写类型,都是小写
-->
<property name="empName" column="empName" length="20" type="java.lang.String"></property>
<property name="workDate" column="workDate" type="java.util.Date"></property>
<!-- 如果列名称为数据库关键字,需要用反引号或改列名 -->
<property name="desc" column="`desc`" type="java.lang.String"></property>
</class>
</hibernate-mapping>
复合主键的映射
- 表对应的User实体类
public class User {
private CompositeKeys keys;
private int age;
public CompositeKeys getKeys(){
return keys;
}
public void setKeys(CompositeKeys keys){
this.keys = keys;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
- 复合主键必须放到一个类里 , 且必须实现Serializable
public class CompositeKeys implements Serializable {
private String userName;
private String address;
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName = userName;
}
public String getAddress(){
return address;
}
public void setAddress(String address){
this.address = address;
}
}
- 复合主键映射配置文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flynn" auto-import="true">
<class name="User">
<!--复合主键,映射-->
<composite-id name="keys">
<key-property name="userName" type="string"></key-property>
<key-property name="address" type="string"></key-property>
</composite-id>
<property name="age" type="int"></property>
</class>
</hibernate-mapping>
集合映射
- javaBean
public class WyxUser {
private int userId;
private String userName;
// 一个用户 对应的多个地址
private Set<String> address;
private List<String> addressList;
// private String[] addressArray; // 映射方式与list一样的
private Map<String, String> addressMap;
public Map<String, String> getAddressMap(){
return addressMap;
}
public void setAddressMap(Map<String, String> addressMap){
this.addressMap = addressMap;
}
public List<String> getAddressList(){
return addressList;
}
public void setAddressList(List<String> addressList){
this.addressList = addressList;
}
public int getUserId(){
return userId;
}
public void setUserId(int userId){
this.userId = userId;
}
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName = userName;
}
public Set<String> getAddress(){
return address;
}
public void setAddress(Set<String> address){
this.address = address;
}
}
- 映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.flynn" auto-import="true">
<class name="WyxUser" table="t_user">
<id name="userId" column="id">
<generator class="native"/>
</id>
<property name="userName"></property>
<!--
set集合属性的映射
name 指定要映射的集合的属性
table 集合属性要映射到的表
key 指定集合表(t_address)的外键字段
element 指定集合表的其他字段
type 元素类型,一定要指定
-->
<set name="address" table="t_address">
<key column="uid"></key>
<element column="address" type="string"></element>
</set>
<!--
list集合映射
list-index 指定的是排序列的名称(因为要保证list集合的有序)
-->
<list name="addressList" table="t_addressList">
<key column="uid"></key>
<list-index column="idx"></list-index>
<element column="address" type="string"></element>
</list>
<!--
map集合的映射
key 指定外键字段
map-key 指定map的key
element 指定map的value
-->
<map name="addressMap" table="t_addressMap">
<key column="uid"></key>
<map-key type="string" column="shortName"></map-key>
<element column="address" type="string"></element>
</map>
</class>
</hibernate-mapping>
- 测试代码
@Test
public void testSaveWUserSet() throws Exception{
WyxUser user = new WyxUser();
user.setUserName("flynn1");
Set<String> addressSet = new HashSet<>();
addressSet.add("china1");
addressSet.add("usa1");
user.setAddress(addressSet);
// 创建session
Session session = sessionFactory.openSession();
// 提交事务
Transaction tx = session.beginTransaction();
// --执行操作--
session.save(user);
// 提交事务
tx.commit();
// 关闭session
session.close();
}
@Test
public void testSaveWUserList() throws Exception{
WyxUser user = new WyxUser();
user.setUserName("flynn2");
List<String> addressList = new ArrayList<>();
addressList.add("china");
addressList.add("usa");
user.setAddressList(addressList);
// 创建session
Session session = sessionFactory.openSession();
// 提交事务
Transaction tx = session.beginTransaction();
// --执行操作--
session.save(user);
// 提交事务
tx.commit();
// 关闭session
session.close();
}
@Test
public void testSaveWUserMap() throws Exception{
WyxUser user = new WyxUser();
user.setUserName("flynn2");
Map<String, String> map = new HashMap<>();
map.put("A001", "china");
map.put("A002", "us");
user.setAddressMap(map);
// 创建session
Session session = sessionFactory.openSession();
// 提交事务
Transaction tx = session.beginTransaction();
// --执行操作--
session.save(user);
// 提交事务
tx.commit();
// 关闭session
session.close();
}
@Test
public void testGet() throws Exception{
Session session = sessionFactory.openSession();
session.beginTransaction();
// 获取
WyxUser user = (WyxUser) session.get(WyxUser.class, 3);
System.out.println(user.getUserId());
System.out.println(user.getUserName());
// 当查询用户时, 用户可以获取用户关联的list集合的数据(因为有正确的映射)
// 当使用到集合数据的使用, 才向数据库发送执行的sql语句(懒加载)
System.out.println(user.getAddressList());
session.getTransaction().commit();
session.close();
}
网友评论