Hiernate 注解版的 关联查询

  1. 1@Entity(name="EntityName")  
  2. 必须,name为可选,对应数据库中一的个表,此处的EntryName要注意,在代码中使用hql进行查询时,需要from Xxx,那么Xxx就是对应的此处的EntryName,所以要注意EntryName的命名,否则会出现映射问题。  
  3.   
  4.    
  5.   
  6. 2@Table(name="",catalog="",schema="")  
  7. 可选,通常和@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据库表的信息  
  8.   
  9. name:可选,表示表的名称。默认地,表名和实体名称一致,只有在不一致的情况下才需要指定表名  
  10. catalog:可选,表示Catalog名称。默认为Catalog("")  
  11. schema:可选,表示Schema名称。默认为Schema("")  
  12.    
  13.   
  14. 3@id  
  15. 必须  
  16.   
  17. @id定义了映射到数据库表的主键的属性,一个实体只能有一个属性被映射为主键。置于getXxxx()前  
  18.   
  19.    
  20.   
  21. 4@GeneratedValue(strategy=GenerationType,generator="")  
  22. 可选  
  23.   
  24. strategy:表示主键生成策略,有AUTO、INDENTITY、SEQUENCE和 TABLE 4种,分别表示让ORM框架自动选择、根据数据库的Identity字段生成、根据数据库表的Sequence字段生成、以及根据一个额外的表生成主键。默认为AUTO  
  25.   
  26. generator:表示主键生成器的名称,这个属性通常和ORM框架相关。例如,Hibernate可以指定uuid等主键生成方式  
  27.   
  28. 示例:  
  29.   
  30.     @Id  
  31.   
  32.     @GeneratedValues(strategy=StrategyType.SEQUENCE)  
  33.   
  34.     public int getPk() {  
  35.   
  36.        return pk;  
  37.   
  38.     }  
  39.   
  40.    
  41.   
  42. 5@Basic(fetch=FetchType,optional=true)  
  43. 可选  
  44.   
  45. @Basic表示一个简单的属性到数据库表的字段的映射,对于没有任何标注的getXxxx()方法。默认即为@Basic  
  46.   
  47. fetch:表示该属性的读取策略,有EAGER和LAZY两种,分别表示主支抓取和延迟加载。默认为EAGER  
  48. optional:表示该属性是否允许为null,默认为true  
  49. 示例:  
  50.   
  51.     @Basic(optional=false)  
  52.   
  53.     public String getAddress() {  
  54.   
  55.        return address;  
  56.   
  57.     }  
  58.   
  59.    
  60.   
  61. 6@Column  
  62. 可选  
  63.   
  64. @Column描述了数据库表中该字段的详细定义,这对于根据JPA注解生成数据库表结构的工具非常有作用   
  65. name:表示数据库表中该字段的名称。默认情形属性名称一致  
  66. nullable:表示该字段是否允许为null。默认为true  
  67. unique:表示该字段是否是唯一标识。默认为false  
  68. length:表示该字段的大小,仅对String类型的字段有效  
  69. insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中。默认为true  
  70. updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段  
  71. columnDefinition:表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE、TIME还是TIMESTAMP。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用  
  72.  示例:  
  73.   
  74.    @Column(name="BIRTH",nullable="false",columnDefinition="DATE")  
  75.   
  76.     public String getBithday() {  
  77.   
  78.        return birthday;  
  79.   
  80.     }  
  81.   
  82.    
  83.   
  84. 7@Transient  
  85. 可选  
  86.   
  87. @Transient表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性  
  88.   
  89. 如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic  
  90.   
  91. 示例:  
  92.   
  93.     //根据birth计算出age属性  
  94.   
  95.     @Transient  
  96.   
  97.     public int getAge() {  
  98.   
  99.        return getYear(new Date()) -getYear(birth);  
  100.   
  101.     }  
  102.   
  103.    
  104.   
  105. 8@ManyToOne(fetch=FetchType,cascade=CascadeType)  
  106. 可选  
  107.   
  108. @ManyToOne表示一个多对一的映射,该注解标注的属性通常是数据库表的外键  
  109.   
  110.  optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true  
  111. fetch:表示抓取策略,默认为FetchType.EAGER  
  112. cascade:表示默认的级联操作策略,可以指定为ALL、PERSIST、MERGE、REFRESH和REMOVE中的若干组合,默认为无级联操作  
  113. targetEntity:表示该属性关联的实体类型,该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity  
  114.    
  115.   
  116. 示例:  
  117.   
  118.     //订单Order和用户User是一个ManyToOne的关系  
  119.   
  120.     //在Order类中定义  
  121.   
  122.     @ManyToOne()  
  123.   
  124.     @JoinColumn(name="USER")  
  125.   
  126.     public User getUser() {  
  127.   
  128.        return user;  
  129.   
  130.     }  
  131.   
  132.    
  133.   
  134. 9@JoinColumn  
  135. 可选  
  136.   
  137. @JoinColumn@Column类似,介量描述的不是一个简单字段,而是一个关联字段,例如,描述一个@ManyToOne的字段.  
  138.   
  139.    
  140.   
  141. name:该字段的名称,由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.  
  142.   
  143.   
  144. 例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键  
  145.   
  146. 其默认的名称为实体User的名称+下划线+实体User的主键名称  
  147.   
  148. 示例:  
  149.   
  150.     见@ManyToOne  
  151.   
  152.    
  153.   
  154. 10@OneToMany(fetch=FetchType,cascade=CascadeType)  
  155. 可选  
  156.   
  157. @OneToMany描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段  
  158.   
  159.    
  160.   
  161. fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存  
  162. cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除  
  163.    
  164.   
  165. 例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除  
  166.   
  167. 示例:  
  168.   
  169.     @OneTyMany(cascade=ALL)  
  170.   
  171.     public List getOrders() {  
  172.   
  173.        return orders;  
  174.   
  175.     }  
  176.   
  177.    
  178.   
  179. 11@OneToOne(fetch=FetchType,cascade=CascadeType)  
  180. 可选  
  181.   
  182. @OneToOne描述一个一对一的关联  
  183.   
  184. fetch:表示抓取策略,默认为FetchType.LAZY  
  185.   
  186. cascade:表示级联操作策略  
  187.   
  188. 示例:  
  189.   
  190.     @OneToOne(fetch=FetchType.LAZY)  
  191.   
  192.     public Blog getBlog() {  
  193.   
  194.        return blog;  
  195.   
  196.     }  
  197.   
  198.    
  199.   
  200. 12@ManyToMany  
  201. 可选  
  202.   
  203. @ManyToMany描述一个多对多的关联,多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理  
  204.   
  205. targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class  
  206.   
  207. mappedBy:表示多对多关联的另一个实体类的对应集合属性名称  

  1.   






案例:
一对一:
package cn.happy.hibernate14onetoone;

import javax.persistence.*;

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="Card")
public class Card {
    @Id
    @GeneratedValue
    private Integer cid;
    private  String cname;
    @OneToOne()
    @JoinColumn(name="hid2")
    private Humen humen;

    public Integer getCid() {
        return cid;
    }

    public void setCid(Integer cid) {
        this.cid = cid;
    }

    public String getCname() {
        return cname;
    }

    public void setCname(String cname) {
        this.cname = cname;
    }

    public Humen getHumen() {
        return humen;
    }

    public void setHumen(Humen humen) {
        this.humen = humen;
    }
}

package cn.happy.hibernate14onetoone;

import javax.persistence.*;

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="Humen")
public class Humen {
    @Id
    @GeneratedValue
    private Integer hid;
    private String hname;
    @OneToOne(mappedBy = "humen")
    private Card card;

    public Integer getHid() {
        return hid;
    }

    public void setHid(Integer hid) {
        this.hid = hid;
    }

    public String getHname() {
        return hname;
    }

    public void setHname(String hname) {
        this.hname = hname;
    }

    public Card getCard() {
        return card;
    }

    public void setCard(Card card) {
        this.card = card;
    }
}





   

    
        oracle.jdbc.OracleDriver
        jdbc:oracle:thin:@localhost:1521:orcl
        sll
        sll
        
        org.hibernate.dialect.Oracle10gDialect

thread
        true

update
        true
     
     
       
   
        
      
        
        
        
        
        
        
        
        
    


大配置 不会变
2.一对多:
package cn.happy.hibernate15onetomany;

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

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="DeptNew")
public class Dept {
    @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "abc")
    @SequenceGenerator(name="abc",sequenceName = "SEQ_SLL",allocationSize = 1)
    private Integer deptno;
    @Column
    private String deptname;
@OneToMany(mappedBy ="dept",cascade = CascadeType.ALL)
    private Set emps=new HashSet();

    public Integer getDeptno() {
        return deptno;
    }

    public void setDeptno(Integer deptno) {
        this.deptno = deptno;
    }

    public String getDeptname() {
        return deptname;
    }

    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }

    public Set getEmps() {
        return emps;
    }

    public void setEmps(Set emps) {
        this.emps = emps;
    }
}

package cn.happy.hibernate15onetomany;

import cn.happy.hibernate07onttomany.*;

import javax.persistence.*;

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="EmpNew")
public class Emp {
    @Id
    @GeneratedValue
    private Integer eid;
    @Column
    private String ename;
    @ManyToOne
    @JoinColumn(name="did")
    private Dept dept;

    public void setEid(Integer eid) {
        this.eid = eid;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }
}



主要是属性上的注解


多对多:
package cn.happy.hibernate16manytomany;

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

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="GameNew")
public class Game {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "sql_Game")
    @SequenceGenerator(name="sql_Game",sequenceName = "sql_Game",allocationSize = 1,initialValue = 1)
    private  Integer gid;
    @Column
    private  String gname;
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="PGNew",joinColumns ={@JoinColumn(name="gid")},
            inverseJoinColumns = {@JoinColumn(name="pid")})
    private Set player=new HashSet();

    public Integer getGid() {
        return gid;
    }

    public void setGid(Integer gid) {
        this.gid = gid;
    }

    public String getGname() {
        return gname;
    }

    public void setGname(String gname) {
        this.gname = gname;
    }

    public Set getPlayer() {
        return player;
    }

    public void setPlayer(Set player) {
        this.player = player;
    }
}



 
package cn.happy.hibernate16manytomany;

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

/**
 * Created by linlin on 2017/10/11.
 */
@Entity
@Table(name="PlayerNew")
public class Player {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "sql_Player")
    @SequenceGenerator(name="sql_Player",sequenceName = "sql_Player",allocationSize = 1,initialValue = 1)
    private Integer pid;

    private String pname;
    @ManyToMany(mappedBy = "player")
    private Set game=new HashSet();

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    public Set getGame() {
        return game;
    }

    public void setGame(Set game) {
        this.game = game;
    }
}




所有的测试类:
package cn.happy.test;


import cn.happy.hibernate15onetomany.Dept;
import cn.happy.hibernate14onetoone.Card;
import cn.happy.hibernate14onetoone.Humen;
import cn.happy.hibernate15onetomany.Emp;
import cn.happy.hibernate16manytomany.Game;
import cn.happy.hibernate16manytomany.Player;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;

import java.util.Set;

/**
 * Created by linlin on 2017/9/22.
 */
public class test1011 {
    Configuration cfg;
    Transaction tx;
    Session session;
    SessionFactory factory;

    @Before
    public void myBefore() {
        //创建配置对象
        cfg = new Configuration().configure("Hibernate.cfg.xml");
        //根据配置对象创建SessionFactory
        factory = cfg.buildSessionFactory();
        //根据SessionFactory创建Session
        session = factory.openSession();
        //在Session创建后开启事务
        tx = session.beginTransaction();
    }


    @Test
    public void Test01() {
        Dept dept = new Dept();
        dept.setDeptname("开发部");
        session.save(dept);
        tx.commit();
        System.out.println("ok");
    }


//一对一
    @Test
    public void Test02() {
        Humen h=new Humen();
        h.setHname("苏苏");
        Card c=new Card();
        c.setCname("身份证");
        c.setHumen(h);

        session.save(c);
        session.save(h);
        tx.commit();
    }

    //一对多
    @Test
    public void Test03() {
        Dept d=new Dept();
        d.setDeptname("人事部");
        Emp e=new Emp();
        e.setEname("呵呵");
        d.getEmps().add(e);
        e.setDept(d);
        session.save(d);
        tx.commit();

    }
    //多对多
    @Test
    public void Test04() {
        Game game1=new Game();
        game1.setGname("吃鸡1");
        Game game2=new Game();
        game2.setGname("打豆豆1");

        Player player1=new Player();
        player1.setPname("C哥1");
        Player player2=new Player();
        player2.setPname("郭华1");


        game1.getPlayer().add(player1);
        game1.getPlayer().add(player2);
        game2.getPlayer().add(player1);
        game2.getPlayer().add(player2);

        session.save(game1);
        session.save(game2);


        tx.commit();


    }
}



你可能感兴趣的:(Hiernate 注解版的 关联查询)