zoukankan      html  css  js  c++  java
  • 框架:Hibernate单向多对多

    一、假定一个人只有多个地址,一个地址对应多个人,那么人和地址对应关系为多对多。

    二、

           1、添加依赖包,参考上篇文章hibernate+mysql入门使用

           2、初始化数据库

    DROP  DATABASE  IF  EXISTS  moy_hibernate;
    CREATE  DATABASE  moy_hibernate   CHARACTER SET UTF8;
    View Code

          3、新建实体类Address和Person

    package com.moy.hibernate4.entity;
    
    import org.hibernate.annotations.Cascade;
    
    import javax.persistence.*;
    
    import org.hibernate.annotations.Cascade;
    import org.hibernate.annotations.CascadeType;
    
    /**
     * [Project]:moy-gradle-project  <br/>
     * [Email]:moy25@foxmail.com  <br/>
     * [Date]:2018/2/25  <br/>
     * [Description]:  <br/>
     *
     * @author YeXiangYang
     */
    @Entity
    @Table(name = "t_address")
    public class Address {
    
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private int addressId;
        private String addressDetail;
    
        public int getAddressId() {
            return addressId;
        }
    
        public void setAddressId(int addressId) {
            this.addressId = addressId;
        }
    
        public String getAddressDetail() {
            return addressDetail;
        }
    
        public void setAddressDetail(String addressDetail) {
            this.addressDetail = addressDetail;
        }
    
        @Override
        public String toString() {
            return "Address{" +
                    "addressId=" + addressId +
                    ", addressDetail='" + addressDetail + ''' +
                    '}';
        }
    }
    View Code
    package com.moy.hibernate4.entity;
    
    import javax.persistence.*;
    import java.util.HashSet;
    import java.util.Set;
    
    /**
     * [Project]:moy-gradle-project  <br/>
     * [Email]:moy25@foxmail.com  <br/>
     * [Date]:2018/2/25  <br/>
     * [Description]:  <br/>
     *
     * @author YeXiangYang
     */
    @Table(name = "t_person")
    @Entity
    public class Person {
        @Id
        @Column(name = "id")
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String name;
        private int age;
        @ManyToMany(targetEntity = Address.class)
        @JoinTable(name = "t_person_address",
                joinColumns = @JoinColumn(name = "person_id", referencedColumnName = "id"),
                inverseJoinColumns = @JoinColumn(name = "address_id", referencedColumnName = "id"))
        private Set<Address> address = new HashSet<>();
    
        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 int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Set<Address> getAddress() {
            return address;
        }
    
        public void setAddress(Set<Address> address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "Person{" +
                    "id=" + id +
                    ", name='" + name + ''' +
                    ", age=" + age +
                    ", address=" + address +
                    '}';
        }
    }
    View Code

          4、新建配置文件hibernate.cfg.xml和log4j.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>
            <!-- 指定连接数据库的url,其中hibernate是本应用连接的数据库名 -->
            <property name="connection.url">jdbc:mysql://localhost:3306/moy_hibernate</property>
            <!-- 指定连接数据库的用户名 -->
            <property name="connection.username">root</property>
            <!-- 指定连接数据库的密码 -->
            <property name="connection.password">123</property>
            <!-- 指定数据库方言 -->
            <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
            <!-- 根据需要自动创建数据表 -->
            <property name="hbm2ddl.auto">update</property>
            <!-- 显示Hibernate持久化操作所生成的SQL -->
            <property name="show_sql">true</property>
            <!-- 将SQL脚本进行格式化后再输出 -->
            <!--<property name="hibernate.format_sql">true</property>-->
            <!-- 罗列所有持久化类的类名 -->
            <mapping class="com.moy.hibernate4.entity.Person"></mapping>
            <mapping class="com.moy.hibernate4.entity.Address"></mapping>
        </session-factory>
    </hibernate-configuration>
    View Code
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
        <appender name="console" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %-5p %-5c{3}:%L %x %n-> %m%n"/>
            </layout>
        </appender>
        <root>
            <priority value="DEBUG"/>
            <appender-ref ref="console"/>
        </root>
    </log4j:configuration>
    View Code

          5、为了方便测试,编写一个获取Session的工具类Hibernate4Utils

    package com.moy.hibernate4.util;
    
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    
    import java.util.Objects;
    
    public abstract class Hibernate4Utils {
    
        static {
            try {
                Configuration conf = new Configuration().configure();
                ServiceRegistry registry = new StandardServiceRegistryBuilder().applySettings(conf.getProperties()).build();
                sessionFactory = conf.buildSessionFactory(registry);
            } catch (Throwable e) {
                throw e;
            }
        }
    
        public static final SessionFactory sessionFactory;
    
        public static final ThreadLocal<Session> sessionThread = new ThreadLocal<>();
    
        /**
         * 获取当前线程安全Session
         */
        public static Session getCurrentSession() {
            Session session = sessionThread.get();
            if (Objects.isNull(session)) {
                session = sessionFactory.openSession();
                sessionThread.set(session);
            }
            return session;
        }
    
        /**
         * 关闭Session
         */
        public static void closeCurrentSession() {
            Session session = sessionThread.get();
            if (Objects.nonNull(session)) {
                session.close();
            }
            sessionThread.set(null);
        }
    }
    View Code

          6、新建测试类ManyToMangTest测试

    package com.moy.hibernate4.entity;
    
    import com.moy.hibernate4.util.Hibernate4Utils;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.junit.After;
    import org.junit.Before;
    import org.junit.Test;
    
    /**
     * [Project]:moy-gradle-project  <br/>
     * [Email]:moy25@foxmail.com  <br/>
     * [Date]:2018/2/25  <br/>
     * [Description]:  <br/>
     *
     * @author YeXiangYang
     */
    public class ManyToMangTest {
    
        Session session;
        Transaction transaction;
    
        @Before
        public void before() {
            session = Hibernate4Utils.getCurrentSession();
            transaction = session.beginTransaction();
        }
    
        @After
        public void after() {
            transaction.commit();
            Hibernate4Utils.closeCurrentSession();
        }
    
        @Test
        public void test() {
    
            Address firstAddress = new Address();
            firstAddress.setAddressDetail(firstAddress.toString());
            session.persist(firstAddress);
    
            Address secondAddress = new Address();
            secondAddress.setAddressDetail(secondAddress.toString());
            session.persist(secondAddress);
    
            Person firstPerson = new Person();
            firstPerson.setName("测试多对多");
            firstPerson.setAge(233);
            firstPerson.getAddress().add(firstAddress);
            firstPerson.getAddress().add(secondAddress);
            session.persist(firstPerson);
    
            Person secondPerson = new Person();
            secondPerson.setName("测试多对多");
            secondPerson.setAge(122);
            secondPerson.getAddress().add(firstAddress);
            secondPerson.getAddress().add(secondAddress);
            session.persist(secondPerson);
        }
    }
    View Code

    yexiangyang

    moyyexy@gmail.com


     

  • 相关阅读:
    纪念一下なぞなぞゲーム
    071221 晴
    Sightseeing Cows poj3621
    【HDU 5721】Palace(平面最近点对)
    继承和多态的一些知识点
    3D Convex Hull HDU 3662 三维凸包
    Monthly Expense POJ 3273 二分
    确定比赛名次 HDU 1285拓扑排序裸题
    序列变换
    Dropping tests 二分+01分数规划
  • 原文地址:https://www.cnblogs.com/moy25/p/8471131.html
Copyright © 2011-2022 走看看