一、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,偷个懒,用反向工程生成实体类和工具类:
不会的可以参考博文:
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(一对多)
oracle和hibernate的正向工程和反向工程(详细图解)
里面用的代码就是一对多的。
Idcard.java完整代码:
package entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.SEQUENCE; import javax.persistence.CascadeType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** * Idcard entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "IDCARD", schema = "LWY", uniqueConstraints = { @UniqueConstraint(columnNames = "USERID"), @UniqueConstraint(columnNames = "CARDNO") }) public class Idcard implements java.io.Serializable { // Fields private Long cardid; private Myuser myuser; private String cardno; private String department; // Constructors /** default constructor */ public Idcard() { } /** minimal constructor */ public Idcard(String cardno) { this.cardno = cardno; } /** full constructor */ public Idcard(Myuser myuser, String cardno, String department) { this.myuser = myuser; this.cardno = cardno; this.department = department; } // Property accessors @SequenceGenerator(name = "generator",sequenceName="seq_idcard",allocationSize=1) @Id @GeneratedValue(strategy = SEQUENCE, generator = "generator") @Column(name = "CARDID", unique = true, nullable = false, precision = 10, scale = 0) public Long getCardid() { return this.cardid; } public void setCardid(Long cardid) { this.cardid = cardid; } @Override public String toString() { return "Idcard [cardid=" + cardid + ", myuser=" + myuser + ", cardno=" + cardno + ", department=" + department + "]"; } @OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL) @JoinColumn(name="userid") public Myuser getMyuser() { return this.myuser; } public void setMyuser(Myuser myuser) { this.myuser = myuser; } @Column(name = "CARDNO", unique = true, nullable = false, length = 20) public String getCardno() { return this.cardno; } public void setCardno(String cardno) { this.cardno = cardno; } @Column(name = "DEPARTMENT", length = 50) public String getDepartment() { return this.department; } public void setDepartment(String department) { this.department = department; } }
Myuser.java完整代码
package entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import static javax.persistence.GenerationType.SEQUENCE; import javax.persistence.CascadeType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.SequenceGenerator; import javax.persistence.Table; import javax.persistence.UniqueConstraint; /** * Myuser entity. @author MyEclipse Persistence Tools */ @Entity @Table(name = "MYUSER", schema = "LWY", uniqueConstraints = @UniqueConstraint(columnNames = "USERNAME")) public class Myuser implements java.io.Serializable { public Myuser(String username, String userpass, Short userage) { super(); this.username = username; this.userpass = userpass; this.userage = userage; } // Fields private Long userid; private String username; private String userpass; private Short userage; private Idcard idcard; // Constructors /** default constructor */ public Myuser() { } /** full constructor */ public Myuser(String username, String userpass, Short userage, Idcard idcard) { this.username = username; this.userpass = userpass; this.userage = userage; this.idcard = idcard; } // Property accessors @SequenceGenerator(name = "generator",sequenceName="seq_myuser",allocationSize=1) @Id @GeneratedValue(strategy = SEQUENCE, generator = "generator") @Column(name = "USERID", unique = true, nullable = false, precision = 10, scale = 0) public Long getUserid() { return this.userid; } public void setUserid(Long userid) { this.userid = userid; } @Column(name = "USERNAME", unique = true, length = 20) public String getUsername() { return this.username; } public void setUsername(String username) { this.username = username; } @Column(name = "USERPASS", length = 20) public String getUserpass() { return this.userpass; } public void setUserpass(String userpass) { this.userpass = userpass; } @Column(name = "USERAGE", precision = 3, scale = 0) public Short getUserage() { return this.userage; } public void setUserage(Short userage) { this.userage = userage; } @Override public String toString() { return "Myuser [userid=" + userid + ", username=" + username + ", userpass=" + userpass + ", userage=" + userage + "]"; } @OneToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL, mappedBy = "myuser") public Idcard getIdcard() { return this.idcard; } public void setIdcard(Idcard idcard) { this.idcard = idcard; } }