1. 程式人生 > >Hibernate中一對一,一對多,多對多的寫法

Hibernate中一對一,一對多,多對多的寫法

hibernate中各類對應的bean類寫法

1、一對一的情況

假設我們用Address類和User類做一對一的對應
User類

package com.telek.model;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import
javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name="user")//如果表明和物件名不一致 則需要單獨加上該註解 public class User implements java.io.Serializable
{
@Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int id; @Column(name="username") private String username; @Column(name="password") private String password; //fetch代表資料的抓取策略lazy就是指用到了該屬性才會去查詢(eager剛好相反) @OneToOne(cascade = {CascadeType.ALL},fetch = FetchType.LAZY ) private
Address address=new Address(); public User(){} public User(String username,String password){ this.username = username; this.password = password; } @return the address public Address getAddress() { return address; } @param address the address to set public void setAddress(Address address) { this.address = address; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

Address類

package com.telek.model;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String address;

    @OneToOne(optional= false,fetch = FetchType.EAGER)//cascade = CascadeType.ALL,
    @JoinColumn(name="uid")
    private User user;


    public int getId() {
        return id;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

1、一對多的情況

假設我們用Address類和User類做一對一的對應
Address類

package com.telek.model;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="address")
public class Address {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String address;

    @ManyToOne(optional= false,fetch = FetchType.EAGER)//cascade = CascadeType.ALL,
    @JoinColumn(name="uid")
    private User user;


    public int getId() {
        return id;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

User類

package com.telek.model;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.Generated;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;



@Entity
@Table(name="user")//如果表明和物件名不一致 則需要單獨加上該註解
public class User implements java.io.Serializable{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    @Column(name="username")
    private String username;
    @Column(name="password")
    private String password;
    //fetch代表資料的抓取策略lazy就是指用到了該屬性才會去查詢(eager剛好相反)
    @OneToMany(cascade = {CascadeType.ALL},mappedBy="user",fetch = FetchType.LAZY )
    private Set<Address> address = new HashSet<Address>();

    public User(){}
    public User(String username,String password){
        this.username = username;
        this.password = password;
    }

    public Set<Address> getAddress() {
        return address;
    }
    public void setAddress(Set<Address> address) {
        this.address = address;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

最後,附上一對多情況中Dao包類的測試方法

public void OnetoMore(){//一對多配置
        Session session = sessionFactory.openSession();
        User user = new User();
        user.setUsername("wjw");
        user.setPassword("wlf");

        Address add1 =  new Address();
        add1.setAddress("浙江");
        Address add2 =  new Address();
        add2.setAddress("北京");

        add1.setUser(user);//在多的一方告訴hibernate我這個物件屬於誰
        add2.setUser(user);
        user.getAddress().add(add1);//在少的一端告訴hibernate我可以新增誰進來
        user.getAddress().add(add2);

        session.beginTransaction();
        session.save(user);
        session.close();
    }

3、多對多的情況

假設我們用Tag類和Topic類作為演示
Tag類

package com.telek.model;
// Generated 2016-3-4 9:16:37 by Hibernate Tools 4.3.1.Final


import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Tag generated by hbm2java
 */
@Entity
@Table(name="tag"
    ,catalog="springdemo"
)
public class Tag  implements java.io.Serializable {


     private Integer tagid;
     private String tag;
     private Set<Topic> topic=new HashSet<Topic>();

    public Tag() {
    }

    public Tag(String tag) {
       this.tag = tag;
    }

     @Id @GeneratedValue(strategy=IDENTITY)


    @Column(name="tagid", unique=true, nullable=false)
    public Integer getTagid() {
        return this.tagid;
    }

    public void setTagid(Integer tagid) {
        this.tagid = tagid;
    }


    @Column(name="tag")
    public String getTag() {
        return this.tag;
    }

    public void setTag(String tag) {
        this.tag = tag;
    }

    /**
     * @return the topic
     */
    @ManyToMany(cascade = {CascadeType.ALL},mappedBy="tag",fetch = FetchType.LAZY )
    public Set<Topic> getTopic() {
        return topic;
    }

    /**
     * @param topic the topic to set
     */
    public void setTopic(Set<Topic> topic) {
        this.topic = topic;
    }
}

Topic類

package com.telek.model;
// Generated 2016-3-4 9:16:37 by Hibernate Tools 4.3.1.Final


import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;

/**
 * Topic generated by hbm2java
 */
@Entity
@Table(name="topic"
    ,catalog="springdemo"
)
public class Topic  implements java.io.Serializable {


     private Integer topicid;
     private String title;
     private String context;
     private Set<Tag> tag = new HashSet<Tag>();

    public Topic() {
    }

    public Topic(String title, String context) {
       this.title = title;
       this.context = context;
    }

     @Id @GeneratedValue(strategy=IDENTITY)


    @Column(name="topicid", unique=true, nullable=false)
    public Integer getTopicid() {
        return this.topicid;
    }

    public void setTopicid(Integer topicid) {
        this.topicid = topicid;
    }


    @Column(name="title")
    public String getTitle() {
        return this.title;
    }

    public void setTitle(String title) {
        this.title = title;
    }


    @Column(name="context")
    public String getContext() {
        return this.context;
    }

    public void setContext(String context) {
        this.context = context;
    }

    /**
     * @return the tag
     */
    @ManyToMany(cascade = {CascadeType.ALL})
    @JoinTable(name="topicandtag",joinColumns=@JoinColumn(name="topicid"),inverseJoinColumns=@JoinColumn(name="tagid"))
    public Set<Tag> getTag() {
        return tag;
    }

    /**
     * @param tag the tag to set
     */
    public void setTag(Set<Tag> tag) {
        this.tag = tag;
    }
}

最後在Dao裡面寫一個方法作為演示

public void ManyToMany(){
        Session session = sessionFactory.openSession();
        Topic topic = new Topic();
        topic.setTitle(("大保健"));
        topic.setContext("來玩來玩");
        Topic topic2 = new Topic();
        topic2.setTitle(("大保健"));
        topic2.setContext("來玩來玩呀");
        Tag tag1 = new Tag();tag1.setTag("服務");
        Tag tag2 = new Tag();tag2.setTag("保健");

        Set<Tag> tags = new HashSet<Tag>();
        tags.add(tag1);tags.add(tag2);
        topic.setTag(tags);

        Set<Topic> topics = new HashSet<Topic>();
        topics.add(topic);
        topics.add(topic2);
        tag1.setTopic(topics);
        tag2.setTopic(topics);

        session.beginTransaction();
        session.save(topic);
        session.getTransaction().commit();
        session.close();
}

發現關係表和Tag表和Topic表都插入資料為正常
最後,附上資料庫表的情況
這裡寫圖片描述
另外,如果在topic和tag兩邊都加上

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="topicandtag",joinColumns=@JoinColumn(name="tagid"),inverseJoinColumns=@JoinColumn(name="topicid"))

即可以不用兩邊set關係,只用一邊關聯就可以兩邊都存入資料庫