请教hibernate多对多,中间表不会插入数据问题

toitorse2 2016-08-04 02:46:42
人员表(User)与权限表(Role)为多对多关系,中间表(User_Role),当使用java程序testn2n时,程序能正常创建user、role、User_Role三张表,且能正常插入数据。当启动tomcat服务器时(spingmvc+hibernate),能正常创建user、role、User_Role三张表,但浏览器输入http://localhost:8080/test/test4.do,数据只能插入user、role表,中间表User_ROLE无法插入数据,请教什么原因?代码如下:

java应用程序:
public class testn2n {
public static void main(String[] args) {

Configuration configuration = new Configuration().configure();

StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder()
.applySettings(configuration.getProperties());
ServiceRegistry serviceRegistry = serviceRegistryBuilder.build();

SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

User use = new User();
use.setName("admin6");
use.setPwd("123");


Role role = new Role();
role.setName("管理员1");

use.getRole().add(role);
role.getUser().add(use);

session.save(use);
session.save(role);

// 5、提交事务
transaction.commit();

// 6、关闭Session
session.close();
// 7、创建一个SessionFactory对象关闭对象
sessionFactory.close();

}
}

spingmvc Controller代码:
@RequestMapping(value = "/test4.do")
public String testsql4(User user,HttpServletRequest request){
User use = new User();
use.setName("admin");
use.setPwd("123");

Role role = new Role();
role.setName("管理员1");

use.getRole().add(role);
role.getUser().add(use);

userService.add(role);
userService.add(use);
return "oktest";
}




User.java

public class User {

private int id;
private String name;
private String pwd;
Set<Role> role = new HashSet<>();


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;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public Set<Role> getRole() {
return role;
}
public void setRole(Set<Role> role) {
this.role = role;
}

}

User.hbm.xml
<hibernate-mapping>
<class name="com.dfp.domain.User" table="USERTABLE">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>

<property name="name" type="java.lang.String">
<column name="NAME" />
</property>

<property name="pwd" type="java.lang.String">
<column name="PWD" />
</property>

<set name="role" table="User_Role" cascade="all">
<key>
<column name="U_ID" />
</key>
<many-to-many column="R_ID" class="com.dfp.domain.Role" />
</set>

</class>
</hibernate-mapping>



Role.java
public class Role {
private int id;
private String name;
Set<User> user = new HashSet<>();

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;
}
public Set<User> getUser() {
return user;
}
public void setUser(Set<User> user) {
this.user = user;
}
}

Role.hbm.xml
<hibernate-mapping>
<class name="com.dfp.domain.Role" table="ROLE">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<set name="user" table="User_Role" inverse="true">
<key>
<column name="R_ID" />
</key>
<many-to-many column="U_ID" class="com.dfp.domain.User" />
</set>
</hibernate-mapping>
...全文
267 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
应该是在hbm.xml中多对多映射找不到对应的ID,建议将Role.hbm.xml中的id、column的name改为r_id;即 <id name="r_id" type="int"> <column name="r_id" /> <generator class="native" /> </id> Rser.hbm.xml中的id、column的name改为u_id,即 <id name="u_id" type="int"> <column name="u_id" /> <generator class="native" /> </id> 这个两个实体类对应的属于也对应映射文件的修改下。试试看。

81,092

社区成员

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

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