解决方案 »
- 项目卡死问题 急!!在线等
- JS和Action之间值传递的问题
- Spring和Hibernate结合问题,tomcat出错,急求解??????
- sessionid的问题
- MyEclipse和SQL2005连接出错
- 【请问】在jsp的Frame框架下,弹出jsp页面的问题。
- 求教关于项目发布到tomcat的问题!
- 请教一个JSP中的简单问题,谢谢了!!
- window.showModalDialog打开的弹出窗口如何向打开它的父窗口对象传递值!
- 剧情请问这是什么编码形式(重奖)
- struts2的导出excel功能,使用迅雷下载第一次可以正常下载,第二次下载的是xxxx.action文件,使用浏览器自身下载时每次都是正常的
- spring 中多个contextConfigLocation的关系
假设user:id,name
role:id,name
user_role:id,user_id,role_id;这样就实现了多对多的关系,一个用户可以有多个角色,一个角色对应多个用户你插入一个用户的时候,只需要向user_role表中插入数据就可以了也就是说你说的那种是可以实现的,那么这个时候需要看你的hibernate如何配置啦User类:
public int id;
public String name;
private List<Role> roles;//在其set方法上添加注解@oneToMany
Role:
int id,
int name;
List<User> users//在set方法上添加注解@oneToMany我想这样应该可以解决你的问题
刚试了一下,还是会在三个表中都插入~! 不知道是不是我写的有问题People类:
private Set<RoleInfo> peopleRole = new HashSet<RoleInfo>();hbm
<set name="peopleRole" table="people_role" lazy="true">
<key column="peoplecode"/>
<many-to-many column="roleId" class="RoleInfo" unique="true"/>
</set>
role:
private Set<XPeople> rolePeople = new HashSet<XPeople>();
hbm
不配置action中:
xpeople.getPeopleRole().add(roleInfo);
registerService.save(xpeople);就是从页面拿到roleInfo对象(包含用户选择的角色的id),在赋给xpeople,存储xpeople,结果存入了三个表
<key column="rolecode"/>
<many-to-many column="peopleId" class="People" unique="true"/>
</set>
打印出来就是三个insert ....单向双向都试了
cascade也配过了
inverse也配过了
unique也配过了难道多对多要么只插入一个主表,要么就插入三个表?不能只插入一个主表一个中间表吗?~!?
拿学生和老师之间的关系来举一个例子哈!Teacher:
private Set<Student> students;
@ManyToMany
@JoinTable(name="t_s",joinColumns={@JoinColumn(name="t_id")},
inverseJoinColumns={@JoinColumn(name="s_id")})/*t_s,表示生成外键表的名字,joinColumns表示和teacher表中id对应的字段,之所以是数组有可能某个表示联合主键 inverseJoinColumns表示和student表中id对应的字段
*/
public Set<Student> getStudents() {
return students;
}Student:
@Entity
public class Student {
private int id;
private String name;
@Id
@GeneratedValue
public int getId() {
return id;
}
}
如果是双向的话:ManyToMany双向:Teacher类如上不改变Student:
private Set<Teacher> teachers;
@ManyToMany(mappedBy="students")
public Set<Teacher> getTeachers() {
return teachers;
}
采用配置文件的方式:
单向:xml映射:
Teacher.hbm.xml文件映射:
<hibernate-mapping package="cn.study.domain">
<class name="Teacher">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property><!--key中的column表示对应于当前这个类(即Teacher)的id的那一列叫什么名字-->
<set name="students" table="t_s">
<key column="t_id"></key>
<many-to-many class="Student" column="s_id"></many-to-many>
</set>
</class>
</hibernate-mapping>
双向:xml映射:
Teacher.hbm.xml内容如单向: Student.hbm.xml更改如下:
<set name="teachers" table="t_s">
<key column="s_id"></key> //相对于本类,即Student
<many-to-many class="Teacher" column="t_id"></many-to-many>
</set>
user_role里不要设置级联。
user和role设置级联
先谢谢你耐心的回答!
我现在的情况和你给的例子的配置是一样的,多对多,单向双向都试过,cascade加与不加我也试过,就比如以你的配置,我在页面添加用户,后台这么写//前台的bean有两个
//xpeople表示用户基本信息
//roleInfo表示用户勾选的角色信息,
//roleInfo和XPeople是多对多
xpeople.getPeopleRole().add(roleInfo);
registerService.save(xpeople);这个时候如果我设置了级联关系cascade="all",那么save完成之后会出现
insert into peopleInfo.....
insert into people_role....
insert into roleinfo....
这样就在角色表里面插入数据了,不行如果不设定级联
hibernate会报错,说我指向了一个瞬时对象,实际就是说我保存用户时关联了角色,需要先保存角色,再保存用户,但是由于我没有设置级联,所以保存就报错~ 最后的结果就是,只插入了peopleinfo,其余的两个没有改变--因为报错如果我不设定级联,为了消除上面的错误,这么写
xpeople.getPeopleRole().add(roleInfo);
registerService.saveRole(roleInfo);
registerService.save(xpeople);
效果也是会在角色表里面插入数据,因为是我自己保存了! 最后的结果就是,设定级联要么插三个表,要么只插一个表!!! 不好使啊!!!
你说的不是很理解
首先我不能在role里面插入数据,所以如果user和role设置了级联,那么不就是我现在的情况吗--插入user会级联插入role!所以我觉得应该是user和user_role设定级联,保存user,也保存user_role,而role不用插入数据,只需要起到一个提供数据参考的作用!!!
是这样吗?
能实现吗?求指点
先谢谢你耐心的回答!
我现在的情况和你给的例子的配置是一样的,多对多,单向双向都试过,cascade加与不加我也试过,就比如以你的配置,我在页面添加用户,后台这么写//前台的bean有两个
//xpeople表示用户基本信息
//roleInfo表示用户勾选的角色信息,
//roleInfo和XPeople是多对多
xpeople.getPeopleRole().add(roleInfo);
registerService.save(xpeople);这个时候如果我设置了级联关系cascade="all",那么save完成之后会出现
insert into peopleInfo.....
insert into people_role....
insert into roleinfo....
这样就在角色表里面插入数据了,不行如果不设定级联
hibernate会报错,说我指向了一个瞬时对象,实际就是说我保存用户时关联了角色,需要先保存角色,再保存用户,但是由于我没有设置级联,所以保存就报错~ 最后的结果就是,只插入了peopleinfo,其余的两个没有改变--因为报错如果我不设定级联,为了消除上面的错误,这么写
xpeople.getPeopleRole().add(roleInfo);
registerService.saveRole(roleInfo);
registerService.save(xpeople);
效果也是会在角色表里面插入数据,因为是我自己保存了! 最后的结果就是,设定级联要么插三个表,要么只插一个表!!! 不好使啊!!!insert三条语句是正确的呀?因为你一个人有了一个新的权限之后.,那么肯定是要更新表的呀,因为你XPeople中有一个list保存了RoelInfo的,同理其他也是的呀,要么就使用单向的