2 imxood imxood 于 2016.02.21 10:00 提问

Hibername多表关系映射出现问题,请教大家

问题: 权限表中的role_id保存结果为null, 下面是详细描述:

涉及三个实体类:

/**
 * 权限表
 * @author Imxood
 * 2016年2月21日
 */
@Entity
@Table(name = "t_permission")
public class Permission implements Serializable {

    private static final long serialVersionUID = 2718494404287816693L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "role_id")
    private Role role;

    public Permission() {
    }

    //getter,setter...
}

/**
 * 角色表
 * @author Imxood
 * 2016年2月21日
 */
@Entity
@Table(name = "t_role")
public class Role implements Serializable {

    private static final long serialVersionUID = 7042556500854817893L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name;

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") })
    private List<User> user;

    @OneToMany(mappedBy = "role", // 指定了由多的那一方来维护关联关系,mappedBy指的是多的一方对1的这一方的依赖的属性,如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表
    fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Permission> permissions;

    public Role() {
    }

//getter,setter...
}

/**
 * 用户表
 * @author Imxood
 * 2016年2月21日
 */
@Entity
@Table(name = "t_user")
public class User implements Serializable {

    private static final long serialVersionUID = -7154917770769302643L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    private String username;
    private String password;

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)// mappedBy指定了由多的那一方来维护关联关系即外键建在多方,如果没有指定由谁来维护关联关系,则系统会给我们创建一张中间表
    @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
    private List<Role> roles;

    public User() {
    }

//getter,setter...
}

我的操作是这样的:

            //数据初始化, 添加两条用户

            //用户1:
            List<Permission> permissions = new ArrayList<> ();
            permissions.add(new Permission("user:*"));

            Role role = new Role("admin", permissions);

            List<Role> roles = new ArrayList<> ();
            roles.add(role);

            User user = new User("imx", "imx", roles);

            user = userServer.save(user);

            //用户2:
            permissions = new ArrayList<> ();
            permissions.add(new Permission("student:*"));

            role = new Role("admin", permissions);

            roles = new ArrayList<> ();
            roles.add(role);

            user = new User("imxood", "imxood", roles);

            user = userServer.save(user);

运行的结果是:

图片说明

预期的效果是role_id是有值的, 红圈的地方肯定不对,请教大家看看,如何使有值?~~

1个回答

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.02.29 18:53

你的操作代码中,创建了Permission对象后,怎么没有设置这个对象的Role角色信息呢?如果没有的话,怎么能级联插入角色列呢!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Hibernate学习笔记 多表映射
前面说了Hibernate的单表映射,由于是实体类和数据表之间一对一的映射,所以比较简单。现在就来说说多表映射,这需要涉及到多个实体类和数据表之间的关系。因此稍微复杂一点。建立实体类我建立了两个实体类,一个作者类,一个文章类,其他方法都忽略了,就留下了注解。作者类如下:@Entity public class Author { @Id @GeneratedValue(strategy
Hibernate表关系映射之一对多映射
一、基本概述 在表中的一对多,是使用外键关联,通过一张表的一个键另一个表的外键来建立一多关系;而在类中表示为一个类中有一个集合属性包含对方类的很多对象,而在另一个类中,只包含前述类的一个对象,从而实现一对多关系的建立! 而在Hibernate中采用的是Set类型集合,使用和来实现。 对于一对多的映射关系可以分为两种情况:单向映射和双向映射。 单向映射:只能从一方访问到另一方,无法反向访问。
多表关系映射
1、一对一(会用即可) 主表:没有外键 有主键 从表:拥有外键的是从表 先操作从表,再去操作主表 one-to-one ,many-to-one 只是表达多个表之间的关系。 外键:目的是多表连接 主键:目的是唯一标识数据 示例: 一个人对应一个身份证 ,一夫一妻制, 一个萝卜一个坑。。。。 一对一的关系用程序如何描述: 示例:一夫一妻制 Husband.java publi
一步步学习Hibernate框架(三):采用jpa实现一对多关联映射(一)
JPA(Java Persistence API)是Sun官方提出的一种Java持久化规范。为Java开发人员提供了一种对象/关系映射工具,管理Java应用中的关系数据。JPA的总体思想和现有Hibernate、TopLink等ORM框架大体一致。总的来说,JPA包括以下3方面的技术: 第一:ORM映射元数据        JPA支持XML和JDK 注释(也可译作注解)两种元数据的形式,元数据
Spring
Spring 的基本原理 与Hibername 结合
Hibernate 关系映射 (一对一,一对多,多对多)
一、概念: 关系:名词,事物之间相互作用、相互联系的状态。 关联:名词:表示对象(数据库表)之间的关系;动词:将对象(数据库表)之间通过某种方式联系起来。 映射:将一种形式转化为另一种形式,包括关系。 级联:动词,有关系的双方中操作一方,另一方也将采取一些动作。   值类型:对象不具备数据库同一性,属于一个实体实例其持久化状态被嵌入到所拥有的实体的表行中,没有标识符。 实体类型:具有
Hibernate 得到 1对多时 layz的值
Hibernate.initialize(user.getForumModerators())
java-hibernate框架4(hibernate多表操作,级联操作与延迟加载,多对多关系操作,hibernate缓存技术)
1、Hibernate多表操作        关系型数据库具有三种常用关系:一对一关系、一对多关系和多对多关系。        建立了一对多关系的表之间,一方中的表叫“主表”,多方中的表叫“子表”;两表中相关联的字段,在主表中叫“主键”,在子表中称“外键”。 一对多关系操作     我们以院系表与学生表为例。在Hibernate映射中,在院系表中添加一个集合属性,集合
oracle 数据库关系映射
关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.关系映射.
JAP映射关联关系
JAP映射关联关系1. 单向多对一Order(多)–>Customer(一)关键点:Order里有一个Customer的成员 /** *@JoinColumn:来映射外键 *@ManyToOne:映射多对一的关系 */ @JoinColumn(name="customer_id") @ManyToOne(fetch=FetchType.LAZY)//使