zoukankan      html  css  js  c++  java
  • [Hibernate]

    Hibernate annotation 多对多:


    下面测试例子会自动生成一张表:card,这张是bank和user表的映射表。里头是bank_id和user_id两个组合字段。

    如果想在这张映射表中加入额外的字段,那么hibernate似乎无法做到。因为这需要把多对多写成两个一对多的关系。事实上这样加额外字段到映射表,好像也是违反了DBMS的设计原则。

    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>
    
            <!-- Database connection settings -->
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="connection.url">jdbc:mysql://127.0.0.1/testdb</property>
            <property name="connection.username">root</property>
            <property name="connection.password"></property>
    
            <!-- JDBC connection pool (use the built-in) -->
            <property name="connection.pool_size">1</property>
    
            <!-- SQL dialect -->
            <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    
            <!-- Enable Hibernate's automatic session context management -->
            <property name="current_session_context_class">thread</property>
    
            <!-- Disable the second-level cache  -->
            <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
    
            <!-- Echo all executed SQL to stdout -->
            <property name="show_sql">true</property>
    
            <!-- Drop and re-create the database schema on startup -->
            <property name="hbm2ddl.auto">update</property>
            
            <mapping class="com.my.bean.User"/>
            <mapping class="com.my.bean.Bank"/>
    
        </session-factory>
    
    </hibernate-configuration>

    HibernateUtil.java

    package com.my.dao.util;
    
    import org.hibernate.SessionFactory;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    
    public class HibernateUtil {
    
        private static final SessionFactory sessionFactory = buildSessionFactory();
    
        private static SessionFactory buildSessionFactory() {
            try {
                // Create the SessionFactory from hibernate.cfg.xml
                Configuration configuration = new Configuration();
                return configuration.configure().buildSessionFactory(
                        new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build());
            } catch (Throwable ex) {
                // Make sure you log the exception, as it might be swallowed
                System.err.println("Initial SessionFactory creation failed." + ex);
                throw new ExceptionInInitializerError(ex);
            }
        }
    
        public static SessionFactory getSessionFactory() {
            return sessionFactory;
        }
        
    }

    Java Beans:

    package com.my.bean;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="user")
    public class User {
        @Id @GeneratedValue @Column(name="user_id", nullable=false)
        private long userID;
        
        @Column(name="user_name", length=100, nullable=false)
        private String userName;
        
        @Column(name="create_time", nullable=false)
        private Date createTime;
        
        @ManyToMany(cascade=CascadeType.ALL)
        @JoinTable(name="card", joinColumns={@JoinColumn(name="user_id")}, inverseJoinColumns={@JoinColumn(name="bank_id")})
        private Set<Bank> banks = new HashSet<Bank>();
    
        public long getUserID() {
            return userID;
        }
    
        public void setUserID(long userID) {
            this.userID = userID;
        }
    
        public String getUserName() {
            return userName;
        }
    
        public void setUserName(String userName) {
            this.userName = userName;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        public Set<Bank> getBanks() {
            return banks;
        }
    
        public void setBanks(Set<Bank> banks) {
            this.banks = banks;
        }
    }
    package com.my.bean;
    
    import java.util.HashSet;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;
    
    import org.hibernate.annotations.Cascade;
    
    @Entity
    @Table(name="bank")
    public class Bank {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        @Column(name="bank_id")
        private long bankID;
        
        @Column(name="bank_name", length=100, nullable=false)
        private String BankName;
        
        @ManyToMany(mappedBy="banks", cascade={CascadeType.ALL})
        private Set<User> users = new HashSet<User>();
    
        public long getBankID() {
            return bankID;
        }
    
        public void setBankID(long bankID) {
            this.bankID = bankID;
        }
    
        public String getBankName() {
            return BankName;
        }
    
        public void setBankName(String bankName) {
            BankName = bankName;
        }
    
        public Set<User> getUsers() {
            return users;
        }
    
        public void setUsers(Set<User> users) {
            this.users = users;
        }
    }

    测试:

    package com.my.init;
    import java.util.Date;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    
    import com.my.bean.Bank;
    import com.my.bean.User;
    import com.my.dao.util.HibernateUtil;
    
    public class Test {
    
        public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().openSession();
            Transaction tx = session.beginTransaction();
            
            try {
                //-------------------------------------------------------
                // add user
                //-------------------------------------------------------
                User user = new User();
                user.setUserName("Robin");
                user.setCreateTime(new Date());
                
                //-------------------------------------------------------
                // add bank
                //-------------------------------------------------------
                Bank bankBCC = new Bank();
                bankBCC.setBankName("BCC");
                Bank bankCBC = new Bank();
                bankCBC.setBankName("CBC");
                
                //-------------------------------------------------------
                // set relcationship
                //-------------------------------------------------------
                user.getBanks().add(bankBCC);
                user.getBanks().add(bankCBC);
                
                //-------------------------------------------------------
                // save
                //-------------------------------------------------------
                session.save(user);
                session.save(bankBCC);
                session.save(bankCBC);
                
                //-------------------------------------------------------
                // remove data
                //-------------------------------------------------------
                session.delete(user);
                
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
                e.printStackTrace();
            }
            
            session.close();
        }
    
    }

    参考文档:

    http://viralpatel.net/blogs/hibernate-many-to-many-annotation-mapping-tutorial/

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/HD/p/3951850.html
Copyright © 2011-2022 走看看