(5)OneToMany单向、双向manytoone

一、OneToMany单向
OneToMany说明是一个组知道有哪些成员,而成员不知道自己是哪个组(这是类层面的理解)。数据库方面还是多端(User)有外键属性。
若两个表中只写OneToMany,则必须写@JoinColumn(name=”groupId”),否则hibernate会当成多对多建立中间表
Group(一端)

/*
 * 一对多,即在一端加
 * 并且不需要在多端加外键。
 * 和多对一产生相同的表
 * 
 * 首先:补充解释单向[在类设计上]:one to many 就是在1端团队中有哪些人员,但是组员并不知道它属于哪类。不要和数据库存储混
 */
@Entity
@Table(name="_Group")//对表重命名(group是关键字,不能作为表名,所以要对其重命名)
public class Group {

    private int id;
    private String name;
    private Set<User> user=new HashSet<User>();
    /*
     * 选set的理由:一个组中含有多个用户,它是不同的用户组成的集合。list与数组很像,可以有重复数据。
     * map需要个key,这里不用指定。set元素不能重复,也没key最合适
     */

    @Id
    @GeneratedValue
    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;
    }
    @OneToMany
    @JoinColumn(name="groupId")
    /*
     * 当只写@OneToMany时,hibernate会生成中间表,当成是多对多的关系
     * 所以要用@JoinColumn(name="groupId") 一个组多个用户,在多端应有外键组
     * 这样就可以产生的是两张表
     */
    public Set<User> getUser() {
        return user;
    }
    public void setUser(Set<User> user) {
        this.user = user;
    }

}

User多端

@Entity 
@Table(name="_User")//对表重命名
public class User {

    private int id;
    private String name;


    @Id //必须加在getId上面
    @GeneratedValue

    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;
    }

二、OneToMany双向:双向必用mappedBy
在此例中创建是指一组中知道有哪些成员;成员也知道他该属于哪个组。
mappedBy:是指当前类中的关联关系不用考虑,只考虑其对面类即可。在此例中,onetomany不再起主导作用,所以不会再有中间表了。一般来说,都是在manyToone端进行外键关联。
User类

@Entity 
@Table(name="_User")//对表重命名
public class User {

    private int id;
    private String name;
    private Group group;

    @Id //必须加在getId上面
    @GeneratedValue

    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }

    @ManyToOne
@JoinColumn(name="gid")//对外键的列重命名
    public Group getGroup() {
        return group;
    }
    public void setGroup(Group group) {
        this.group = group;
    }
}

Group类

/*
 * 一对多,即在一端加
 * 并且不需要在多端加外键。
 * 和多对一产生相同的表
 */
@Entity
@Table(name="_Group")//对表重命名(group是关键字,不能作为表名,所以要对其重命名)
public class Group {

    private int id;
    private String name;
    private Set<User> user=new HashSet<User>();
    /*
     * 选set的理由:一个组中含有多个用户,它是不同的用户组成的集合。list与数组很像,可以有重复数据。
     * map需要个key,这里不用指定。set元素不能重复,也没key最合适
     */

    @Id
    @GeneratedValue
    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;
    }
    @OneToMany(mappedBy="group")
    /*
    双向映射,将用户作为主表,在从表中的映射不算,mappedBy=主表中的属性。若不写,则会在user表中产生两个冗余字段:groupId、group_id
    这样在生成表时就不考虑onetomany方
    */
    public Set<User> getUser() {
        return user;
    }
    public void setUser(Set<User> user) {
        this.user = user;
    }

}
posted @ 2017-11-12 14:24  测试开发分享站  阅读(120)  评论(0编辑  收藏  举报