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表中插入数据。

转载于:https://www.cnblogs.com/studyCenter/p/6709222.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值