idea中注解配置一對多,多對一,雙向多對一映射(不詳細)


一對多

package cn.pojo;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

@Entity //聲明這是一個實體類 必寫
public class District implements Serializable {
    private static final long serialVersionUID = 8009273978191878070L;
    //編號
    @Id //標識屬性 相當於數據庫中的主鍵
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "seq_dis")   //strategy設置標識的生成策略
    @SequenceGenerator(name = "seq_dis",sequenceName = "seq_dis_id", //聲明序列 自動增長唯1 從1開始自增
            allocationSize = 1,initialValue = 1)
    private Integer id;
    //區縣名稱
    @Column(name = "name")  //將屬性映射到數據庫中 填寫列名不區分大小寫
    private String name;
    //街道
    @OneToMany(cascade = {CascadeType.ALL}) //一對多,不需要指定類型,cascade是為了指定級聯操作。
    @JoinColumn(name = "district_Id")  //另一個表的外鍵 填寫列名 有了@joincolumn注解 就不能有mappedBy屬性否則會出兼容問題這個跟hibernate版本有關.我的是5
    private Set<Street> streetSet;

    public Set<Street> getStreetSet() {
        return streetSet;
    }

    public void setStreetSet(Set<Street> streetSet) {
        this.streetSet = streetSet;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public District(Integer id, String name) {
        this.id = id;
        this.name = name;
    }
    public District(){}
}

多對一  

package cn.pojo;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Set;

@Entity //聲明這是一個實體類 必寫
public class Street implements Serializable {
    private static final long serialVersionUID = 2465299058773906791L;
    //編號
    @Id //標識屬性
    @GeneratedValue(strategy = GenerationType.IDENTITY) //設置生成策略
    private Integer id;
    //街道名稱
    @Column(name = "name")   //將屬性映射到數據庫中 填寫列名 不區分大小寫
    private String name;
    //所屬區縣
    @ManyToOne  //多對一
    @JoinColumn(name = "district_Id")   //指向另一個表的外鍵 填寫列名
    private District district;

    @OneToMany     
    @JoinColumn(name = "street_id")
    private Set<House> houses;

    public District getDistrict() {
        return district;
    }

    public void setDistrict(District district) {
        this.district = district;
    }

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Street(){}
}

多對多

  

package entity;

import javax.persistence.*;
import java.util.Objects;
import java.util.Set;

@Entity
public class EmployeeEntity {
    private long empid;
    //員工名
    private String empname;
    //開發過的項目
    private Set<ProjectEntity> projects;

    @ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
    @JoinTable(name = "proemp"  //中間表的名字
            ,joinColumns ={@JoinColumn(name = "rempid")}    //與當前id有關的外鍵
            ,inverseJoinColumns = {@JoinColumn(name = "rproid")})   //另一個表有關的外鍵,也就是跟Project
    public Set<ProjectEntity> getProjects() {
        return projects;
    }

    public void setProjects(Set<ProjectEntity> projects) {
        this.projects = projects;
    }

    @Id
    public long getEmpid() {
        return empid;
    }

    public void setEmpid(long empid) {
        this.empid = empid;
    }

    @Column(name = "EMPNAME")
    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }
}

 

package entity;

import javax.persistence.*;
import java.util.Objects;
import java.util.Set;

@Entity
public class ProjectEntity {
    private long proid;
    //項目名稱
    private String proname;
    //工作人員
    private Set<EmployeeEntity> employees;

    @ManyToMany
    @JoinTable(name = "proemp"  //如上
            ,joinColumns ={@JoinColumn(name = "rproid")} //如上
            ,inverseJoinColumns = {@JoinColumn(name = "rempid")}) //如上
    public Set<EmployeeEntity> getEmployees() {
        return employees;
    }

    public void setEmployees(Set<EmployeeEntity> employees) {
        this.employees = employees;
    }

    @Id
    @Column(name = "PROID")
    public long getProid() {
        return proid;
    }

    public void setProid(long proid) {
        this.proid = proid;
    }

    @Column(name = "PRONAME")
    public String getProname() {
        return proname;
    }

    public void setProname(String proname) {
        this.proname = proname;
    }
}

多對多測試的時候出現了一個問題如下

An AnnotationConfiguration instance is required to use <mapping class="entity.ProjectEntity"/>

 意思是,用了注解了,自然要用注解類生成SessionFactory,剛出現的時候很懵逼,因為說hibernate4以上的版本是不會出現這種問題的,於是找了半天.

最后發現就是這個問題如下

configuration=new AnnotationConfiguration();
//configuration = new Configuration().configure(); 注釋這一段加上 上面一段 下面再多點下configure();
//獲取session對象
sessionFactory =configuration.configure().buildSessionFactory();

因為自動生成的注解是在get上面的所以就沒改了.

使用idea自動生成實體類注解和實體類

沒有hibernate配置點擊加號自動生成一個

 第二步

第三步

確保這個連接成功之后第四步

之后會進入如下界面

最后確定即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM