zoukankan      html  css  js  c++  java
  • hibernate Annotation 以及注解版的数据关联

    目的是不写xxx.hbm.xml映射文件,使用注解

    主配置文件还是要有hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
            
        <session-factory>
            
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql:///hibernate</property>
            <property name="connection.username">root</property>
            <property name="connection.password">root</property>
            
            <!-- 方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!-- c3p0数据源 -->
            <property name="c3p0.max_size">10</property>
            <property name="c3p0.min_size">2</property>
            <property name="c3p0.timeout">5000</property>
            <property name="c3p0.max_statements">100</property>
            <property name="c3p0.idle_test_period">3000</property>
            <property name="c3p0.acquire_increment">2</property>
            <property name="c3p0.validate">false</property>
            
            <property name="show_sql">true</property>
            <property name="current_session_context_class">thread</property>
            
            <!-- 开启二级缓存 使用EhCache实现-->
            <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
            
            
            <!-- 不同的是这里,不写映射文件,而是完全限定名 -->
            <mapping class="com.kaishengit.pojo.User"/>
            <mapping class="com.kaishengit.pojo.Address"/>
            <mapping class="com.kaishengit.pojo.Teacher"/>
            <mapping class="com.kaishengit.pojo.Student"/>
            <mapping class="com.kaishengit.pojo.Employee"/>
            <mapping class="com.kaishengit.pojo.Dept"/>
            <mapping class="com.kaishengit.pojo.Person"/>
            <mapping class="com.kaishengit.pojo.Card"/>
            <mapping class="com.kaishengit.pojo.Account"/>
            <!-- 
            <mapping resource="com/kaishengit/pojo/User.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Address.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Person.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Card.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Employee.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Dept.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Student.hbm.xml"/>
            <mapping resource="com/kaishengit/pojo/Teacher.hbm.xml"/>
             -->
        </session-factory>
            
            
    </hibernate-configuration>

    -------------------------------------------------------------------
    -------------------------------------------------------------------

    一对多,多对一 记得添加到主配置文件中去

    取而代之的是在类上注解

    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.OrderBy;
    import javax.persistence.Table;
    import org.hibernate.annotations.Cache;
    import org.hibernate.annotations.CacheConcurrencyStrategy;
    @Entity// 表示这是一个pojo类 
    @Table(name="user")// 与数据库中表对应,表名和类名相同的可以不写 
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)/*加入缓存  */
    public class User {
        
        @Id/*放在这个属性上,表示这个属性在数据库中是主键,如果属性的名字和数据库中的
            主键不一样,要加注解@column(name="id")*/
        //@column(name="id")
        @GeneratedValue(strategy=GenerationType.IDENTITY)/* 主键生成策略*/
        private Integer id;
        
        
        /*普通属性不用管,自动映射,但是如果列名和属性名不一样要加column */
        //@Column(name="username")
        private String username;
        private String password;
        /* 多的一方维护关系,user不用管,mappedBy="user"(user是自己在对方类中属性的名字)相当于inverse,放弃关系维护 */
        @OneToMany(mappedBy="user")
        @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)// 加入缓存 
        @OrderBy("id desc")//排序
        private Set<Address> addressSet;
    }
    @Entity
    @Table
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)/* 加入缓存 */
    public class Address {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String address;
        @ManyToOne//多对一
        @JoinColumn(name="userid")//指定外键
        private User user;
    }

    ---------------------------------------------------------------
    ---------------------------------------------------------------
    ---------------------------------------------------------------

    多对多 ,记得添加到主配置文件中去

    @Entity
    @Table
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    public class Student {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String name;
        
        @ManyToMany                            /*自己在关系表中的外键*/        /* 对方在关系表中的外键*/
        @JoinTable(name="student_teacher",joinColumns={@JoinColumn(name="sid")},inverseJoinColumns={@JoinColumn(name="tid")})
        private Set<Teacher> teachers;
    
    }
    @Entity
    @Table
    @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
    public class Teacher {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String name;
        @ManyToMany(mappedBy="teachers")//放弃维护 
        @OrderBy("id desc")
        @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)
        private Set<Student> students;
        
        
    }

    --------------------------------------------------------
    --------------------------------------------------------

    一对一

    第一种一对一

    person和card,card的id即作为主键,又作为外键

    @Entity
    @Table
    public class Person {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String name;
        
        @OneToOne
        @PrimaryKeyJoinColumn/*告诉card,主键是靠着我(person) 产生的 */
        private Card card;
    @Entity
    @Table
    public class Card {
    /* JPA中的主键生成策略只有四种,不支持外键生成器 所以写一个生成器GenericGenerator,名字叫FK
        生成策略叫foreign,
            这个person是属性,指明用card这个类的person属性对应的表的主键作外键*/
        @Id
        @GenericGenerator(name="FK",strategy="foreign",parameters={@Parameter(name="property",value="person")})
        @GeneratedValue(generator="FK")// 指定多用的生成器
        private Integer id;
        private String cardnum;
        
        @OneToOne(mappedBy="card")
        @PrimaryKeyJoinColumn
        private Person person;
        

    第二种一对一,是一对多或者多对一的特殊情况

    dept和Employee,dept中有eid,Employee中有deptid

    @Entity
    @Table
    public class Employee {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String name;
        @ManyToOne
        @JoinColumn(name="deptid")
        private Dept dept;
    }
    @Entity
    @Table
    public class Dept {
    
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        private String name;
        @ManyToOne
        @JoinColumn(name="eid")
        private Employee employee;
    
    
    }

    ----------------------------------------------------------
    -------------------------------------------------------
    -----------------------------------------------------

    id不想用自动增长型,想用UUID怎么设置主键生成策略?

    @Entity
    @Table
    public class Account {
    
        
        private String id;
        private String name;
        
        @Id
        @GenericGenerator(name="myuuid",strategy="uuid")
        @GeneratedValue(generator="myuuid")
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        
        // 排除不进行持久化操作的属性 
        @Transient
        public String getNickName() {
            return "Hello,Jack";
        }
        
        
    }

    程序执行.不用生成UUID,只需要保存

    session.beginTransaction();
            
            Account account = new Account();
            account.setName("hello");
            
            session.save(account);
            
            session.getTransaction().commit();
  • 相关阅读:
    CAS单点登录(一)——初识SSO
    Sql Server 增加字段、修改字段、修改类型、修改默认值
    SQL 聚合函数-非聚合函数
    漫画:什么是中台?
    windows下nginx的安装及使用
    sql优化点
    如何处理sql中的关键字(例如',%)
    Mysql 如何创建一张临时表
    MySQL中information_schema是什么
    mysql查看表结构命令,如下:
  • 原文地址:https://www.cnblogs.com/itliucheng/p/4463419.html
Copyright © 2011-2022 走看看