Hibernate 映射关系(基于注解)

提示:表与表之间的映射关系通过外键或中间表建立联系:

  • 单向外键映射关系:这里主要是指在两个映射表对象类(一对一关系)之间只有一方包含另一方的引用,比如映射对象类A与映射表对象B之间,如果只有A中有一个属性是对B的引用 private B b;那么就称为单向外键关系。
  • 双向外键映射关系;这里指双方都包含一方的引用,但如果是没有中间表,那么就要指定主控方与被控方。
    上面所说的单向外键关系与映射外键关系虽然存在着引用的差别,但是(比如一对一或者多对多等)在建表的时候,表的结构是一样的,比如主控方是A被控方是B,两种情况下表结构一样,都是A对应的表中包含B的主键作为外键,不同的是,单向外键关系,从主控方的对象可以获取被控方对象,而双向外键关系则可以从任何一方获取另一方的对象。差别在于hibernate操作数据库的时候,是否连带关联操作被控方。
    这里使用的是Hibernate5 而且里面有一个包与javaEE库有冲突 :在用@JoinColumn(name=”pid”)创建外键一直报错 是因为 javax.persistence.jar与 hibernate中的hibernate-jpa-2.1-api-1.0.0.Final.jar冲突,可以先删除javaEE类库然后在重新添加就可以了。
    这里使用的是hibernate5
    配置文件:
<?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="dialect">org.hibernate.dialect.MySQLDialect</property>  
     <property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF8</property>
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
     <property name="connection.username">root</property>
     <property name="connection.password">12345</property>
     <property name="show_sql">true</property>
     <property name="format_sql">true</property>
     <property name="hbm2ddl.auto">update</property>
     <property name="hibernate.current_session_context_class">thread</property>
    <!--   
      <mapping class="com.hibernate.environment.Students"/>
      <mapping class="com.hibernate.environment.Person"/>
      <mapping class="com.hibernate.environment.Dog"/>
    -->

      <mapping class="com.hibernate.relationship.oneTone.IdCardOneToOneFK"/>
      <mapping class="com.hibernate.relationship.oneTone.PersonOneToOneFK"/>


    </session-factory>
</hibernate-configuration>

1、一对一单向外键关系
主控方person类(含有IdCard类引用,并且数据库表中含有IdCard对应表字段作为外键)

package com.hibernate.relationship.oneTone;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
//一对一单向外键
@Entity
public class PersonOneToOneFK {
   

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY ) //整型可以指定默认增长策略
    private int wid;
    private int age;

    @OneToOne(cascade=CascadeType.ALL) //全级联关系
    @JoinColumn(name="pid",unique=true) //指定外键名称为pid
    private IdCardOneToOneFK idCard;

    public PersonOneToOneFK() {

    }

    public PersonOneToOneFK( int age, IdCardOneToOneFK idCard) {
        this.age = age;
        this.idCard = idCard;
    }

    public int getWid() {
        return wid;
    }

    public void setWid(int wid) {
        this.wid = wid;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public IdCardOneToOneFK getIdCard() {
        return idCard;
    }

    public void setIdCard(IdCardOneToOneFK idCard) {
        this.idCard = idCard;
    }
}

被控方IdCard类

package com.hibernate.relationship.oneTone;



import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

import org.hibernate.annotations.GenericGenerator;
@Entity
public class IdCardOneToOneFK  {
   
    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid",strategy="assigned")
    @Column(length=18)
    private String pid; //主键是字符串类型需要指定主键生成器以及生成策略,同时还要指定长度,否则默认255长度会报错不能作为主键长度
    @Column(length=24)
   private String name;
    public IdCardOneToOneFK() {
        super();
        // TODO Auto-generated constructor stub
    }
    public IdCardOneToOneFK(String pid, String name) {
        super();
        this.pid = pid;
        this.name = name;
    }
    public String getPid() {
        return pid;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
</
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值