zoukankan      html  css  js  c++  java
  • hibernate之复合主键作为外键的相关配置

    1.首先得有一个复合主键类CompositClassTest存在

    CompositClassTest.java

    package home.yhs.entity;
    
    import java.io.Serializable;
    
    public class CompositClassTest implements Serializable{
    
        /**
         * 
         */
        private static final long serialVersionUID = -1605112043060635015L;
    
        String classId;
    
        String className;
    
        public String getClassId() {
            return classId;
        }
    
        public void setClassId(String classId) {
            this.classId = classId;
        }
    
        public String getClassName() {
            return className;
        }
    
        public void setClassName(String className) {
            this.className = className;
        }
    
    }

    注意:该类不需要单独的配置文件

    2.其次得的有一个包含复合主键类(CompositClassTest)的类ClassTest存在

    ClassTest.java:

    package home.yhs.entity;
    
    public class ClassTest {
    
        CompositClassTest compositClassTest;//复合主键,用一个单独的类来表示
        
        String num;
        
        public CompositClassTest getCompositClassTest() {
            return compositClassTest;
        }
    
        public void setCompositClassTest(CompositClassTest compositClassTest) {
            this.compositClassTest = compositClassTest;
        }
    
        public String getNum() {
            return num;
        }
    
        public void setNum(String num) {
            this.num = num;
        }
        
    }

    对应的配置文件ClassTest.hbm.xml:

    <?xml version="1.0"?>  
    <!DOCTYPE hibernate-mapping PUBLIC   
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <hibernate-mapping>  
        <class name="home.yhs.entity.ClassTest" table = "classtest"> 
               <composite-id name = "CompositClassTest" class = "home.yhs.entity.CompositClassTest">
                   <key-property name="classId"></key-property>
                   <key-property name="className"></key-property>//这部分就是对应复合主键类的相关配置
               </composite-id>
              <property name="num"></property>
        </class>  
    </hibernate-mapping>

    3.接下来有一个User.java类与对应的ClassTest类产生Many to one 的单向映射关系

    User.java:

    package home.yhs.entity;  
      
    import java.util.Date;  
      
    public class User {  
      
        private String id;  
        
        private String name;  
        
        private String password;  

      private ClassTest classTest;//User类想要与ClassTest类达成单向映射的关系,必须包含ClassTest类的引用 public User() { super(); } public ClassTest getClassTest() { return classTest; } public void setClassTest(ClassTest classTest) { this.classTest = classTest; } 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; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }

    对应的配置文件User.hbm.xml:

    <?xml version="1.0"?>  
    <!DOCTYPE hibernate-mapping PUBLIC   
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
    <hibernate-mapping>  
        <class name="home.yhs.entity.User" table = "User"> 
            <id name="id">  
                <generator class="assigned"/> 
            </id>  
            <property name="name"/>  
            <property name="password"/>  
            <many-to-one name="classTest" class="home.yhs.entity.ClassTest" cascade="all" unique="true" lazy="false">
            <column name="classId"></column>
            <column name="className"></column>
            </many-to-one> 
        </class>  
    </hibernate-mapping>

    4.最后再来一个测试类:

    package home.yhs.util;
    
    import java.util.Date;
    
    import org.hibernate.Hibernate;
    
    import home.yhs.entity.ClassTest;
    import home.yhs.entity.CompositClassTest;
    import home.yhs.entity.User;
    
    public class Test {
    
        public static void main(String[] args) {
            CompositClassTest compositClassTest = new CompositClassTest();
            compositClassTest.setClassId("3");
            compositClassTest.setClassName("yhs");
            ClassTest clasTest = new ClassTest();
            clasTest.setCompositClassTest(compositClassTest);//添加复合主键到对应的类
            clasTest.setNum("234");
    //        HibernateUtils.insert(clasTest);
            User user = new User();
            user.setId("2");
            user.setName("某某某");
            user.setPassword("root");
            user.setCreateTime(new Date());
            user.setExpireTime(new Date());
            user.setClassTest(clasTest);
            HibernateUtils.insert(user); 
        /*    User user = new User();
            user.setId("4");
            User user1 = (User) HibernateUtils.getById(User.class, user.getId());
            System.out.println(user1.getClassTest().getNum());*/
        }
    }

    注意:在实现User与ClassTest的单映射之后,在User执行插入操作的时候,会先到ClassTest对应的数据表中查找User对应的复合外键的数据行是否存在,如果存在则不再插入,如果不存在,则会先向ClassTest表中插入数据,然后再向User表中插入数据。

  • 相关阅读:
    彻底清除Linux centos minerd木马 实战  跟redis的设置有关
    linux 弹出光驱失败
    teamviewer "TeamViewer Daemon is not running
    linux 如何查找io的进程
    网站开启https后加密协议始终是TLS1.0如何配置成TLS1.2?
    查看openssl的版本
    https单向认证和双向认证
    pem转换成der
    locate: can not open `/var/lib/mlocate/mlocate.db': No such file or directory
    mysql 有报错  ERROR! MySQL is not running, but lock file (/var/lock/subsys/mysql) exists
  • 原文地址:https://www.cnblogs.com/studyCenter/p/6709222.html
Copyright © 2011-2022 走看看