视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Hibernate关联关系映射(双向篇)
2020-11-09 16:26:37 责编:小采
文档


Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。 Hibernate连接管理类HibernateUtil.Java public class HibernateUtil { private st

Hibernate关联关系可分为单向关联和双向关联两大类。单向关联可以分为一对一、一对多、多对一和多对多4种关联方式,而多向关联可以分为一对一、一对多和多对多3种关联方式。

Hibernate连接管理类HibernateUtil.Java

public class HibernateUtil {
 private static SessionFactory sessionFactory;

 private static final ThreadLocal threadLocal = new ThreadLocal();

 static{
 try{
 Configuration cfg = new Configuration().configure();
 sessionFactory = cfg.buildSessionFactory();
 }catch(Throwable ex){
 throw new ExceptionInInitializerError(ex);
 }
 }

 public static SessionFactory getSessionFactory(){
 return sessionFactory;
 }

 public static Session getSession() throws HibernateException{
 Session session = (Session)threadLocal.get();
 if(session == null || !session.isOpen()){
 session = (sessionFactory != null)?sessionFactory.openSession():null;
 threadLocal.set(session);
 }

 return session;
 }

 public static void closeSession() throws HibernateException{
 Session session = (Session)threadLocal.get();
 threadLocal.set(null);
 if(session != null){
 session.close();
 }
 }

 public static void shutdown(){
 getSessionFactory().close();
 }

}

1.双向的一对一关联

(1)通过主键关联

通过主键关联的双向一对一映射,在需要一方的配置文件中将主键生成策略配置成foreign,即表示需要根据另一方的主键来生成自己的主键,而该实体本身不具有自己的主键生成策略。

示例:

实体类:

User.java

public class User {
 private int userid;
 private String name;
 private String password;
 private Address address;

 public int getUserid() {
 return userid;
 }
 public void setUserid(int userid) {
 this.userid = userid;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public Address getAddress() {
 return address;
 }
 public void setAddress(Address address) {
 this.address = address;
 } 
}

Address.java

public class Address {
 private int addressid;
 private String addressinfo;
 private User user;

 public int getAddressid() {
 return addressid;
 }
 public void setAddressid(int addressid) {
 this.addressid = addressid;
 }
 public String getAddressinfo() {
 return addressinfo;
 }
 public void setAddressinfo(String addressinfo) {
 this.addressinfo = addressinfo;
 }
 public User getUser() {
 return user;
 }
 public void setUser(User user) {
 this.user = user;
 } 

}

表结构:

User表

Address表

配置文件:

Use.hbm.xml


 
 
 
 

 
 
 
 

 

 

Address.hbm.xml


 >
 
 
 user
 
 

 
 

 

 

测试类Test.java

public class Test {
 public static void main(String[] args){
 Session session = HibernateUtil.getSession();
 Transaction tx = session.beginTransaction();

 User u = new User();
 u.setName("sbw");
 u.setPassword("123"); 


 Address a = new Address();
 a.setAddressinfo("heu");

 a.setUser(u);
 u.setAddress(a);


 session.save(u);
 session.save(a);
 tx.commit();

 HibernateUtil.closeSession();

 }
}

测试结果:

(2)通过外键关联

通过外键关联的双向一对一映射,外键可以放在任意一方。在存放外键一方的映射文件中,需要添加many-to-one元素,并为该元素添加unique=“true”属性。而另一方的配置文件中要添加one-to-one元素,并使用其name属性来指定关联属性名。此时,存放外键的一方对应的数据表为从表,而另一方对应的数据表变为主表。

实体类与通过主键关联相同。

表结构:

user表

address表

配置文件:

User.hbm.xml


 
 
 
 

 
 
 
 

 

 

Address.hbm.xml


 
 
 
 
 

 
 

 
 
 

 

测试类与通过主键关联一样

测试结果:

2.双向的一对多关联(与双向多对一完全相同)

双向的一对多关联在“多”的一方要增加新属性以引用关联实体,在“一”的一方则增加集合属性,该集合中包含“多”的一方的关联实体。

实体类:

User.java

public class User {
 private int userid;
 private String name;
 private String password;
 private Set address = new HashSet();

 public int getUserid() {
 return userid;
 }
 public void setUserid(int userid) {
 this.userid = userid;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public Set getAddress() {
 return address;
 }
 public void setAddress(Set address) {
 this.address = address;
 } 
}

Address.java

public class Address {
 private int addressid;
 private String addressinfo;
 private User user;

 public int getAddressid() {
 return addressid;
 }
 public void setAddressid(int addressid) {
 this.addressid = addressid;
 }
 public String getAddressinfo() {
 return addressinfo;
 }
 public void setAddressinfo(String addressinfo) {
 this.addressinfo = addressinfo;
 }
 public User getUser() {
 return user;
 }
 public void setUser(User user) {
 this.user = user;
 } 

}

表结构:

user表

address表

配置文件

User.hbm.xml


 
 
 
 

 
 
 
 

 
 
 
 

 
 

 

Address.hbm.xml


 
 
 
 
 

 
 

 
 
 

 

测试类Test.java

public class Test {
 public static void main(String[] args){
 Session session = HibernateUtil.getSession();
 Transaction tx = session.beginTransaction();

 User u = new User();
 u.setName("sbw");
 u.setPassword("123"); 


 Address a = new Address();
 a.setAddressinfo("heu");
 Address a1 = new Address();
 a.setAddressinfo("hrb");

 a.setUser(u);
 a1.setUser(u);

 u.getAddress().add(a);
 u.getAddress().add(a1);

 session.save(a);
 session.save(a1);
 session.save(u);
 tx.commit();

 HibernateUtil.closeSession();

 }
}

测试结果:

3.双向的多对多关联

在双向的多对多关联中,两端都要添加Set集合属性。要实现双向的多对多关联,必须使用中间表来实现两个实体间的关联关系。

示例:

实体类

User.java

public class User {
 private int userid;
 private String name;
 private String password;
 private Set address = new HashSet();

 public int getUserid() {
 return userid;
 }
 public void setUserid(int userid) {
 this.userid = userid;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
 public String getPassword() {
 return password;
 }
 public void setPassword(String password) {
 this.password = password;
 }
 public Set getAddress() {
 return address;
 }
 public void setAddress(Set address) {
 this.address = address;
 } 
}

Address.java

public class Address {
 private int addressid;
 private String addressinfo;
 private Set user = new HashSet();

 public int getAddressid() {
 return addressid;
 }
 public void setAddressid(int addressid) {
 this.addressid = addressid;
 }
 public String getAddressinfo() {
 return addressinfo;
 }
 public void setAddressinfo(String addressinfo) {
 this.addressinfo = addressinfo;
 }
 public Set getUser() {
 return user;
 }
 public void setUser(Set user) {
 this.user = user;
 } 

}

表结构:

user表

address表

user_address表

配置文件

User.hbm.xml:


 
 
 
 

 
 
 
 

 
 
 
 

 
 

 

Address.hbm.xml


 
 
 
 
 

 
 

 
 
 
 

 
 

 

测试类Test.java

public class Test {
 public static void main(String[] args){
 Session session = HibernateUtil.getSession();
 Transaction tx = session.beginTransaction();

 User u = new User();
 u.setName("sbw");
 u.setPassword("123"); 

 User u1 = new User();
 u1.setName("gaoya");
 u1.setPassword("456");

 Address a = new Address();
 a.setAddressinfo("heu");
 Address a1 = new Address();
 a1.setAddressinfo("hrb");

 a.getUser().add(u);
 a.getUser().add(u1);
 a1.getUser().add(u);
 a1.getUser().add(u1);

 u.getAddress().add(a);
 u.getAddress().add(a1);
 u1.getAddress().add(a);
 u1.getAddress().add(a1);

 session.save(a);
 session.save(a1);
 session.save(u);
 session.save(u1);
 tx.commit();

 HibernateUtil.closeSession();

 }
}

测试结果:

下载本文
显示全文
专题