!!注意: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);
不会的可以参考博文:
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>