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

来源:互联网 发布:linux ping网络不可达 编辑:程序博客网 时间:2024/06/09 16:03

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

一、OneToOne(一对一)

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

-- 表myusercreate table myuser(       userid number(10) primary key,       username varchar2(20) unique,       userpass varchar2(20),       userage number(3))
-- 表idcardcreate 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_myuserminvalue 1 maxvalue 9999999999start with 3increment by 1cache 20;-- 表seq_idcard的序列create sequence seq_idcardminvalue 1 maxvalue 9999999999start with 3 increment by 1cache 20;
-- 为idcard表添加外键useridalter 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,方便观察输出

@Overridepublic 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,方便观察输出

@Overridepublic 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.32Idcard [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;@Entitypublic 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;@Entitypublic 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>


跑完控制台输出如下: