hibernate使用总结

[img]http://dl2.iteye.com/upload/attachment/0102/1407/8562dd10-5afb-3e5a-9bb5-c644a265f219.png[/img]
[color=red]多对多建立中间表,一对多的一方有set多方内容,数据库我一般在多方的数据表设置外键,如bank表的admin_id。而且该外键不需要private出来[/color]
[b]实体类Admin.java[/b]
public class Admin {	
private int id;//其主键
private String admin_code;
private String password;
private String name;
private String email;
private String telephone;
private Date enrolldate;

private Set<Role> roles;//一个管理员拥有很多角色

private Set<Bank> banks;//一个管理员拥有很多张银行卡
//省略set,get方法
}

[b]实体类Role.java[/b]
public class Role {

private int id;
private String name;
private Set<Admin> admins;
}

[b]实体类Bank.java[/b]
	private int id;
private String bankName;
private String bankSal;
//private int adminId;作为外键可以不写
}

映射需要知道(学习时的笔记):
[color=red]常用的主键生成策略有以下几种:[/color]
1.identity:用户自动增长的主键生成方式,除了Oralce不支持以为,其他的数据库一般都支持。
2.sequence: Oracle中使用,用序列生成主键
3.native: 自动匹配,看核心配置文件hibernate.cfg.xml中方言:
如果为MySQL对应的方言,相当于identity;如果为Oracle对应的方言,相当于使用sequence。
4.increment:相当先去对应的表中查询主键的最大值,然后+1后进行添加。不要求主键自动增长。不常用。
5.assigned:手动生成id
[color=red]常用的Hibernate映射类型:[/color]
A.string 字符串
B.integer:
C.double
D.date :日期,只保存年月日
E.datetime:日期:年月日时分秒
F.timestamp:时间戳:存放年月日时分秒…
G.yes_no:将在数据库保存一个字符 Y/N
H.true_false:在数据库中保存一个字符: T/F 功能和yes_no基本相同。
I.boolean
J.blob、clob用来保存大文件(比如:文档、视频,音频)
[color=red]Cascade、inverse、fetch属性总结[/color]
1.cascade属性的六个值:
save-update:级联添加\修改
delete: 级联删除
delete-orphan:删除多方中某N个(大于等于1)
all: 级联添加、修改、删除 save-update + delete
all-delete-orphan: all + delete-orphan === save-update + delete + delete-orphan
2.inverse属性:
true :将控制权限交给对方
false: 控制权自己留着。
3.fetch
a.join 连接的方式进行查询
b.select 默认的方式 Sql语句分开写,用于延迟加载
c.subselect: 子查询的方式(one-to-many的配置中不生效)
[b]Admin.hbm.xml映射[/b]
<hibernate-mapping 
package="com.zqw.pojo">
<class name="Admin" table="admin">
<id name="id">
<generator class="native"/>
</id>
<property name="admin_code"></property>
<property name="password"></property>
<property name="name"></property>
<property name="email"/>
<property name="telephone"></property>
<property name="enrolldate" type="timestamp"/>

<set name="roles" table="admin_role" inverse="false" lazy="false" >
<key column="admin_id"></key>
<many-to-many class="Role" column="role_id"/>
</set>

<set name="banks" inverse="false" cascade="all">
<key column="admin_id" />
<one-to-many class="com.zqw.pojo.Bank" />
</set>
</class>
</hibernate-mapping>

[b]Role.hbm.xml映射[/b]
<hibernate-mapping 
package="com.zqw.pojo">
<class name="Role" table="role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>

<set name="admins" table="admin" lazy="false">
<key column="role_id"/>
<many-to-many class="Admin" column="admin_id"/>
</set>
</class>
</hibernate-mapping>

[b]Bank.hbm.xml映射[/b]
<hibernate-mapping>
<class name="com.zqw.pojo.Bank" table="BANK" >
<id name="id" type="java.lang.Integer">
<column name="ID" precision="11" scale="0" />
<generator class="native"/>
</id>

<property name="bankName" type="java.lang.String">
<column name="BANK_NAME" length="50" />
</property>
<property name="bankSal" type="java.lang.String">
<column name="BANK_SAL" length="50" />
</property>
<!--当然也不需要写外键adminId-->
</class>
</hibernate-mapping>

[b]测试如下[/b]

	//@Test
public void save(){
Admin admin = new Admin();
admin.setAdmin_code("zgdw");
admin.setName("zgdw");
admin.setEmail("110@qq.com");
admin.setPassword("111");
admin.setEnrolldate(new Date(System.currentTimeMillis()));
admin.setTelephone("110");
//多对多
int[] ids = {1,2};
Set<Role> roles = new HashSet<Role>();
for (int i:ids){
Role role = new Role();
role.setId(i);
roles.add(role);
}
//一对多
Set<Bank> bk = new HashSet<Bank>();

Bank ba = new Bank();
ba.setBankName("建行");
ba.setBankSal("100");
bk.add(b1);
Bank ba2 = new Bank();
ba2.setBankName("招商");
ba2.setBankSal("200");
bk.add(ba2);

admin.setBanks(bk);
admin.setRoles(roles);
dao.save(admin);
}

[color=green]打印sql语句[/color]

Hibernate:
insert
into
admin
(admin_code, password, name, email, telephone, enrolldate)
values
(?, ?, ?, ?, ?, ?)
Hibernate:
insert
into
BANK
(BANK_NAME, BANK_SAL)
values
(?, ?)
Hibernate:
insert
into
BANK
(BANK_NAME, BANK_SAL)
values
(?, ?)
Hibernate:
insert
into
admin_role
(admin_id, role_id)
values
(?, ?)
Hibernate:
insert
into
admin_role
(admin_id, role_id)
values
(?, ?)
Hibernate:
update
BANK
set
admin_id=?
where
ID=?

我们看到执行过程,一对多有一个update,数据库中没有数据则插入数据,然后跟新bank表的admin_id这个字段。因此倘若bank表有以前有一样的数据,那么会跟新admin_id为当前的数据。(我的应用:设备与端口,一般是先增加端口,端口的shebeiId这个字段为0,然后为设备增加端口,此时端口表的shebeiId变为当前的设备ID.)
[img]http://dl2.iteye.com/upload/attachment/0102/1413/d52f0314-6587-3abe-9031-5e0117109544.png[/img]

[color=red]多对一,多个Service使用cost,在多方数据表设置外键,即多方Service增加cost_id字段[/color]

[img]http://dl2.iteye.com/upload/attachment/0102/1415/9399402b-5aac-3495-8f1b-78ff396c89d8.png[/img]
[b]Service.java实体类[/b]
public class Service{
private int id;
private String name;

private Cost cost;//属于cost,其实就是cost_id(mapping文件)
}

[b]Cost.java实体类[/b]

public class Cost {
private int id;
private String name;
}

[b]Srevice.hbm.xml映射[/b]
<hibernate-mapping>
<class name="com.zqw.pojo.Service" table="SERVICE">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="10" scale="0" />
<generator class="native"/>
</id>
<many-to-one name="cost" class="com.zqw.pojo.Cost" fetch="select">
<column name="COST_ID" precision="4" scale="0" not-null="true" />
</many-to-one>

<property name="name" type="java.lang.String">
<column name="NAME" length="15" not-null="true" />
</property>
</class>
</hibernate-mapping>

[b]Cost.hbm.xml映射[/b]
<hibernate-mapping>
<class name="com.zqw.pojo.Cost" table="COST">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="4" scale="0" />
<generator class="native"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="50" not-null="true" />
</property>

</class>
</hibernate-mapping>

[b]测试如下:[/b]

public void save(){
Cost c = dao2.findById(1);//把cost为1的数据取出来
Service s = new Service();
s.setName("zgdw");
s.setCost(c);
dao.save(s);
}

[color=green]打印sql语句[/color]
Hibernate: 
select
cost0_.ID as ID8_0_,
cost0_.NAME as NAME8_0_,
from
COST cost0_
where
cost0_.ID=?
Hibernate:
insert
into
SERVICE
(COST_ID,NAME)
values
(?, ?)

我们看到往Service数据表的cost_id字段增加数据,也就是cost_id为必须,cost的name这些都可以不需要,和mapping文件有关。(我的应用:jsp页面隐藏service.cost.id,但是可以显示cos.name)

[img]http://dl2.iteye.com/upload/attachment/0102/1417/d5246410-6fe1-3695-b483-63568fc37b82.png[/img]
这是我对hibernate的一些初步的总结,当然也可以在实体类里加上如List其他的数据,不一定要和数据表元素一一对应,如有什么错误的地方欢迎大家矫正,谢谢。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值