oracle和hibernate的一对一(OneToOne),一对多(OneToMany),(详细图解)

3 篇文章 0 订阅
3 篇文章 0 订阅

!!注意:hibernate级联只支持主键和外键类型为整型的级联

一、OneToOne(一对一)

1,OneToOne 关联是OneToMany的特列,来看看oracle语句

-- 表myuser
create table myuser(
       userid number(10) primary key,
       username varchar2(20) unique,
       userpass varchar2(20),
       userage number(3)
)
-- 表idcard
create table idcard(
       cardid number(10) primary key,
       cardno varchar2(20) unique not null,
       department varchar2(50),
       userid number(10) not null
)
-- 表myuser的序列
create sequence seq_myuser
minvalue 1 maxvalue 9999999999
start with 3increment by 1
cache 20;
-- 表seq_idcard的序列
create sequence seq_idcard
minvalue 1 maxvalue 9999999999
start with 3 increment by 1
cache 20;
-- 为idcard表添加外键userid
alter table idcard
      add constraint fk_userid foreign key(userid)
      references myuser(userid);
一对一关联的核心,外键唯一,就是要有唯一约束

alter table idcard add constraint uk_userid unique(userid);


2,偷个懒,用反向工程生成实体类和工具类:

不会的可以参考博文: 

oracle和hibernate的正向工程和反向工程(详细图解)



3. 修改实体类:

Idcard.java实体类需要修改3个地方:

i.1)用上刚刚生成的序列,使插入的时候id会自动生成

@SequenceGenerator(name = "generator",sequenceName="seq_idcard",allocationSize=1)

i.2)添加toString,方便观察输出

@Override
	public String toString() {
		return "Idcard [cardid=" + cardid + ", myuser=" + myuser + ", cardno="
				+ cardno + ", department=" + department + "]";
	}

i.3)修改OneToOne的注解,添加级联,并指定外键

@OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name="userid")
Myuser.java实体类需要修改4个地方:

u.1)添加一个构造函数,测试的时候会用到

public Myuser(String username, String userpass, Short userage) {
		super();
		this.username = username;
		this.userpass = userpass;
		this.userage = userage;
	}

u.2)用上刚刚生成的序列,使插入的时候id会自动生成

@SequenceGenerator(name = "generator",sequenceName="seq_myuser",allocationSize=1)
u.3)添加toString,方便观察输出

@Override
	public String toString() {
		return "Myuser [userid=" + userid + ", username=" + username
				+ ", userpass=" + userpass + ", userage=" + userage + "]";
	}
u.4)修改OneToOne的注解,添加级联,指定映射表

@OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL, mappedBy = "myuser")

4. 使用级联添加,写一个测试类Test.java:

package test;

import org.hibernate.Session;

import utils.HibernateSessionFactory;
import entity.Idcard;
import entity.Myuser;

public class Test {
	private static Session session = (Session) HibernateSessionFactory.getSession();
	
	
	public static Idcard findIdcard(Long id){
		return (Idcard)session.get(Idcard.class, id);
	}
	public static long addIdcard(Idcard card){
		session.beginTransaction();
		long id =  (Long) session.save(card);
		session.getTransaction().commit();
		System.out.println(id);
//		HibernateSessionFactory.closeSession();
		return id;
	}
	public static void main(String[] args) {
		Myuser user = new Myuser("lwy","123456",(short)22);
		Idcard id = new Idcard(user,"350586433121218331","Minnan_Normal_University");
		long cardid = addIdcard(id);
		System.out.println(findIdcard(cardid));
	}
}

跑完程序之后,控制台输出如下:

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
32
Idcard [cardid=32, myuser=Myuser [userid=30, username=lwy, userpass=123456, userage=22], cardno=350586433121218331, department=Minnan_Normal_University]

二、OneToMany(一对多)

这里我们用正向工程, 因为正向工程会自动建表和序列(贼智能),所以数据库就不用建表了。

举个栗子:sex和user,一个sex有多个user,比如:sex男的有很user。


sex.java

package entity;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;

@Entity
public class Sex {
	private Integer sexid;
	private String sexname;
	private Set<Users> users;
	
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq")
	@SequenceGenerator(name="seq",sequenceName="seq_sex",allocationSize=1)
	public Integer getSexid() {
		return sexid;
	}
	public Sex(String sexname) {
		super();
		this.sexname = sexname;
	}
	public Sex(Integer sexid, String sexname, Set<Users> users) {
		super();
		this.sexid = sexid;
		this.sexname = sexname;
		this.users = users;
	}
	public void setSexid(Integer sexid) {
		this.sexid = sexid;
	}
	@Column(name="sexname")
	public String getSexname() {
		return sexname;
	}
	public void setSexname(String sexname) {
		this.sexname = sexname;
	}
	@OneToMany(cascade=CascadeType.ALL,mappedBy="sex",fetch=FetchType.LAZY)
	public Set<Users> getUsers() {
		return users;
	}
	public void setUsers(Set<Users> users) {
		this.users = users;
	}
	public Sex() {
		super();
	}
	
}

users.java

package entity;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity
public class Users {
	private Integer userid;
	private String username;
	private Integer userage;
	private Sex sex;
	public Users(Integer userid, String username, Integer userage, Sex sex) {
		super();
		this.userid = userid;
		this.username = username;
		this.userage = userage;
		this.sex = sex;
	}
	public Users(String username, Integer userage, Sex sex) {
		super();
		this.username = username;
		this.userage = userage;
		this.sex = sex;
	}
	public Users(String username, Integer userage) {
		super();
		this.username = username;
		this.userage = userage;
	}
	
	@Id
	@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq")
	@SequenceGenerator(name="seq",sequenceName="seq_users",allocationSize=1)
	public Integer getUserid() {
		return userid;
	}
	public void setUserid(Integer userid) {
		this.userid = userid;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Integer getUserage() {
		return userage;
	}
	public Users() {
		super();
	}
	public void setUserage(Integer userage) {
		this.userage = userage;
	}
	@ManyToOne(fetch=FetchType.LAZY)
	@Cascade(value=CascadeType.SAVE_UPDATE)
	@JoinColumn(name="sexid")
	public Sex getSex() {
		return sex;
	}
	public void setSex(Sex sex) {
		this.sex = sex;
	}
	
}
Test.java

package test;

import org.hibernate.Session;

import utils.HibernateSessionFactory;
import entity.Sex;
import entity.Users;

public class Test {
	public static void addUser(Users user){
		Session session =(Session)HibernateSessionFactory.getSession();
		session.beginTransaction();
		session.save(user);
		session.getTransaction().commit();
		HibernateSessionFactory.closeSession();
	}
	
	public static void main(String [] args){
		Sex sex = new Sex("男");
		Users user = new Users("lwy",22,sex);
		addUser(user);
	}
}
hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
	<property name="dialect">
		org.hibernate.dialect.Oracle9Dialect
	</property>
	<property name="connection.url">
		jdbc:oracle:thin:127.0.0.1:1521:orcl
	</property>
	<property name="connection.username">lwy</property>
	<property name="connection.password">lwy123</property>
	<property name="connection.driver_class">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="myeclipse.connection.profile">
		oracle.jdbc.driver.OracleDriver
	</property>
	<property name="show_sql">true</property>
	<property name="hbm2ddl.auto">create</property>
	<mapping class="entity.Sex" />
	<mapping class="entity.Users" />

</session-factory>

</hibernate-configuration>


跑完控制台输出如下:







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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值