使用orcale数据库hibernate能用多对多关系吗

kanglig888 2010-11-16 06:31:49
使用orcale数据库hibernate能用多对多关系吗??如果能用那么中间表的Id怎么办!?怎么让它自增?
...全文
102 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
kanglig888 2010-11-19
  • 打赏
  • 举报
回复
8楼的兄弟,我项目里刚开始用的是sql server2005数据库,使用多对多没有问题,后来改成了oracle,,但是在执行插入的时候报错,说找不到中间表的ID,因为oracle的ID列不是不能自增吗,我也建了序列,但是还是不行??我把中间表的主键ID删了,就没事了,郁闷!!!!,大家是怎么做的啊,我刚刚使用oracle,不是太会用!!
Jlins 2010-11-19
  • 打赏
  • 举报
回复
hibernate是通用数据库的 什么数据库都可以
kanglig888 2010-11-19
  • 打赏
  • 举报
回复
我试试,先谢谢了
aini136234058 2010-11-19
  • 打赏
  • 举报
回复
给你发了一个多对多的案例,自己看看吧
bb12152205gg 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jxl63589847 的回复:]
引用 6 楼 kanglig888 的回复:
比如我有一个role表,有一个right表,有一个中间表role-right
我在项目中创建实体类,形成role,right类还有它们的映射,在映射中配置它们的ID为自增,
添加的时候,中间表没有插入成功,缺少中间表的ID,因为Oracle的Id不是没有自增吗,怎么办??
你可以创建序列 让ID自增! 看看资料就OK了
[/Quote]


我的学习笔记
希望对你有帮助
bb12152205gg 2010-11-17
  • 打赏
  • 举报
回复
★多对多关联映射_单向(用户→角色)
★多对多关联映射_双向(用户<-->角色)



1.多对多关联映射_单向(用户→角色)
多对多关联映射,需要一张中间表建立关系才可以体现出多对多关系
---
举例说明:
①新建User.java和Role.java
User.java代码如下:
public class User {
private int id;
private String name;
//体现用户可以有多个角色
private Set roles;

public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role.java代码如下:
public class Role {
private int id;
private String name;

public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
---
②新建Role.hbm.xml和User.hbm.xml
Role.hbm.xml代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.Role" table="t_role">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
User.hbm.xml代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- table="t_user_role"
多对多关系中,中间表的名称
hibernate会自动生成
-->
<set name="roles" table="t_user_role">
<!-- column="userid"
将t_user表的主键在中间表
生成一个叫userid的字段
-->
<key column="userid"></key>
<!-- 体现多对多关系 -->
<many-to-many class="com.lxl.bean.Role" column="roleid"></many-to-many>
</set>
</class>
</hibernate-mapping>
---
③在hibernate.cfg.xml中将Role.hbm.xml和User.hbm.xml配置
...
<mapping resource="com/lxl/bean/User.hbm.xml"/>
<mapping resource="com/lxl/bean/Role.hbm.xml"/>
</session-factory>
---
④利用ExportDB.java建表以及创建工厂的HibernateUtils.java
拷贝过来
---
⑤新建测试类ManytomanyTest,继承于TestCase
//方法testManytomany()保存数据
public void testManytomany(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

//角色:发布人员
Role role1 = new Role();
role1.setName("发布人员");
session.save(role1);

//角色:审核人员
Role role2 = new Role();
role2.setName("审核人员");
session.save(role2);

//用户:lxl
//角色:发布人员,审核人员
User user1 = new User();
user1.setName("lxl");
Set userset1 = new HashSet();
userset1.add(role1);
userset1.add(role2);
user1.setRoles(userset1);
session.save(user1);

//用户:pw
//角色:发布人员
User user2 = new User();
user2.setName("pw");
Set userset2 = new HashSet();
userset2.add(role1);
user2.setRoles(userset2);
session.save(user2);

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
//测试加载(因为是单向的,所以只能由user→role)
public void testManytomany2(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

User user = (User) session.load(User.class, 3);
System.out.println("用户名:"+user.getName());
for(Iterator iterator = user.getRoles().iterator();iterator.hasNext();){
Role role = (Role) iterator.next();
System.out.println("对应的角色:"+role.getName());
}

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}

2.多对多关联映射_双向(用户<-->角色)
需要修改Role.java和Role.hbm.xml的代码,
Role.java需要修改的代码如下:
public class Role {
private int id;
private String name;
//体现角色可以有多个用户
private Set users;

public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role.hbm.xml需要修改的代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.Role" table="t_role">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="name"></property>
<set name="users" table="t_user_role">
<key column="roleid"></key>
<many-to-many class="com.lxl.bean.User" column="userid"></many-to-many>
</set>
</class>
</hibernate-mapping>
-----
因为双向的保存数据与单向相同,我们就不演示了
显示一下加载
//测试加载(双向)
public void testManytomany3(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();

Role role = (Role) session.load(Role.class, 1);
System.out.println("角色名:"+role.getName());
for(Iterator iterator = role.getUsers().iterator();iterator.hasNext();){
User user = (User) iterator.next();
System.out.println("对应的用户:"+user.getName());
}

tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
在控制台我们可以看到:
角色名:发布人员
对应的用户:pw
对应的用户:lxl
也许有的人发现了,用户的显示顺序并不是按照我们保存用户时的顺序显示的
那么,怎么办?
hibernate提供了一个属性:order-by
...
<set name="users" table="t_user_role" order-by="userid">
...
order-by="userid"表示按照用户的主键排序,再次运行testManytomany3()
你可以在控制台看到:
角色名:发布人员
对应的用户:lxl
对应的用户:pw
jxl63589847 2010-11-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kanglig888 的回复:]
比如我有一个role表,有一个right表,有一个中间表role-right
我在项目中创建实体类,形成role,right类还有它们的映射,在映射中配置它们的ID为自增,
添加的时候,中间表没有插入成功,缺少中间表的ID,因为Oracle的Id不是没有自增吗,怎么办??
[/Quote] 你可以创建序列 让ID自增! 看看资料就OK了


kanglig888 2010-11-17
  • 打赏
  • 举报
回复
比如我有一个role表,有一个right表,有一个中间表role-right
我在项目中创建实体类,形成role,right类还有它们的映射,在映射中配置它们的ID为自增,
添加的时候,中间表没有插入成功,缺少中间表的ID,因为Oracle的Id不是没有自增吗,怎么办??
kanglig888 2010-11-17
  • 打赏
  • 举报
回复
但是它中间表的Id获得不了啊,
jacking124 2010-11-16
  • 打赏
  • 举报
回复
谁有案例,发给我看看,jacking124@sohu.com
clinique 2010-11-16
  • 打赏
  • 举报
回复
当然能啊,跟id没什么关系的,是object对object多对多啊,,,
wangxuewenaptech 2010-11-16
  • 打赏
  • 举报
回复
把邮箱发给我 我给你发过去!一份案例!
kanglig888 2010-11-16
  • 打赏
  • 举报
回复
有没有人回吗

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧