`
esffor
  • 浏览: 1367482 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Hibernate一对一外键关联实现方法实例

阅读更多

有连个实体如下:

CREATE TABLE `product` (
  `id` 
varchar(50NOT NULL,
  `name` 
varchar(50default NULL,
  
PRIMARY KEY  (`id`)
) ENGINE
=InnoDB DEFAULT CHARSET=gb2312;

CREATE TABLE `product` (
  `id` 
varchar(50NOT NULL,
  `name` 
varchar(50default NULL,
  
PRIMARY KEY  (`id`)
) ENGINE
=InnoDB DEFAULT CHARSET=gb2312;

 首先,建立这两个实体如下:

 

package onetoone;

public class Image ...{
   
private String id;
   
private String name;
   
private Product product;

public Product getProduct() ...{
    
return product;
}

public void setProduct(Product product) ...{
    
this.product = product;
}

public String getId() ...{
    
return id;
}

public void setId(String id) ...{
    
this.id = id;
}

public String getName() ...{
    
return name;
}

public void setName(String name) ...{
    
this.name = name;
}

}



package onetoone;

public class Product ...{
    
private String id;
    
private String name;
    
private Image image;
    
public String getId() ...{
        
return id;
    }

    
public void setId(String id) ...{
        
this.id = id;
    }

    
public Image getImage() ...{
        
return image;
    }

    
public void setImage(Image image) ...{
        
this.image = image;
    }

    
public String getName() ...{
        
return name;
    }

    
public void setName(String name) ...{
        
this.name = name;
    }


}


接下来建立两个持久类的mapping文件

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping package="onetoone"> 
  
<class name="Product" table="product"> 
    
<id name="id" unsaved-value="null">
      
<column name="id"></column>
      
<generator class="uuid.hex"></generator>
    
</id>
    
<property name="name" column="name"></property>
    
<one-to-one name="image"
                class
="Image"
                fetch
="join"
                cascade
="all"
                property-ref
="product">
    
</one-to-one>
  
</class> 

</hibernate-mapping>

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping package="onetoone"  > 
  
<class name="Image" table="image"> 
    
<id name="id">
      
<generator class="uuid.hex"/>
    
</id>
    
<property name="name" column="name"></property>
     
<many-to-one name="product"
                 class
="Product"
                 unique
="true"

                 column
="productid">             
     
</many-to-one>
  
</class> 

</hibernate-mapping>


测试代码:

 

    public static void main(String[] args) ...{
        Configuration cfg
=new Configuration();
        cfg.configure();
        SessionFactory sf
=cfg.buildSessionFactory();
        Session session
=sf.openSession();
        Transaction t
=session.beginTransaction();
        
//        Image image=new Image();
//        image.setName("image1");
//        
//        Product product=new Product();
//        product.setName("product1");
//        product.setImage(image);
//        image.setProduct(product);
//        session.save(product);
        

        Product p
=(Product)session.get(Product.class"1");
        System.out.println(p.getImage());

        t.commit();
        System.out.println(
"success");

    }


先在数据库中插入一个product的记录,id为1,image也插入一条记录,其productid为1,便于测试 查询代码

查询结果为
Hibernate: select product0_.id as id1_1_, product0_.name as name1_1_, image1_.id as id0_0_, image1_.name as name0_0_, image1_.productid as productid0_0_ from product product0_ left outer join image image1_ on product0_.id=image1_.productid where product0_.id=?
onetoone.Image@6754d6
success

有一点很重要,也是困扰笔者几个小时的地方,就是在主方(product)的配置文件中<one-to-one>中的
property-ref="product" 如果不加这个属性,Hibernate会使用image表的主键作为关联类的属性,结果HQL语句就会变成
Hibernate: select product0_.id as id1_1_, product0_.name as name1_1_, image1_.id as id0_0_, image1_.name as name0_0_, image1_.productid as productid0_0_ from product product0_ left outer join image image1_ on product0_.id=image1_.id where product0_.id=?

大家注意看,product0_.id=image1_.i,这明显是不对的,应该是product0_.id=image1_.productid ,这样才能正确关联上



分享到:
评论

相关推荐

    Hibernate一对一唯一外键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的...以上就是关于Hibernate一对一唯一外键关联映射(单向关联)的详细说明。通过这种方式,我们可以轻松地在Java应用中处理数据库的一对一关系。

    hibernate一对一之唯一外键关联(双向关联)

    本篇主要探讨的是Hibernate中的一对一(OneToOne)关系映射,特别是唯一外键关联(UniDirectional and Bidirectional Association)的情况。我们将深入理解这种关联方式的配置、实现以及它在实际应用中的价值。 1. ...

    hibernate一对一唯一外键关联映射(单项关联)

    在本案例中,我们将详细探讨“hibernate一对一唯一外键关联映射(单项关联)”。 首先,一对一关联分为两种类型:单向关联和双向关联。单向关联意味着在一个实体类中存在对另一实体的引用,而另一实体类中没有相应...

    Hibernate一对一单向外键关联 (联合主键annotation)

    通过这种方式,你可以实现Hibernate中一对一单向外键关联及联合主键的配置。这使得两个实体间的关系更加明确,同时也方便了数据的管理和操作。在实际项目中,这样的设计可以提高数据的完整性和一致性。

    hibernate一对一唯一外键关联映射(双向关联)

    本篇将深入探讨Hibernate中的一对一唯一外键关联映射,特别是双向关联的实现。 ### 1. 一对一关联概述 一对一关联意味着一个实体只能与另一个实体的单一实例相关联,这种关系通常出现在两个表之间,其中一个表的...

    Hibernate一对一唯一外键关联映射(双向关联)

    主键关联是通过两个实体的主键相等来实现一对一关系,而唯一外键关联则是在一个实体中定义另一个实体的唯一外键字段。 在Hibernate中,配置一对一唯一外键关联映射通常涉及以下步骤: 1. **实体类定义**: - 对于...

    Hibernate教程05_关系映射之一对一双向外键关联

    在Hibernate中,一对一关系可以通过两种方式实现:外键关联和主键关联。本教程重点讨论的是外键关联,这意味着一方的表将包含指向另一方表的外键。双向关联意味着两个实体类都可以直接访问彼此。 接下来,我们将...

    Hibernate教程04_关系映射之一对一单向外键关联

    本教程重点讲解了一对一(One-to-One)单向外键关联的实现方法。在数据库设计中,一对一关系意味着两个实体之间存在唯一对应的关系,比如一个人只有一个身份证,或者一个房间只有一扇门。在Hibernate中,这种关系...

    Hibernate一对一外键映射

    **标题:Hibernate一对一外键映射** 在关系型数据库中,一对一(One-to-One)关联是一种常见的关系,它表示两个实体之间存在着唯一的关系。Hibernate,作为Java领域中的一个流行的ORM(对象关系映射)框架,提供了...

    hibernate中的 一对一唯一外键双向关联

    本篇将深入探讨在Hibernate中实现一对一唯一外键的双向关联。 **一、配置一对一关联** 在Hibernate中,一对一关联可以通过以下两种方式建立: 1. **通过主键关联(Primary Key Join)**:这种关联方式下,一方的...

    Hibernate Annotation 基于外键的一对多双向关联

    本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...

    详解Hibernate一对一映射配置

    在Java持久化框架Hibernate中,一对一(One-to-One)映射是对象关系映射的一种常见方式,用于表示两个实体...了解并掌握这些配置方法,可以帮助开发者更有效地实现Hibernate中的一对一映射,提高代码的可读性和维护性。

    hibernate一对一关联关系

    以上就是关于Hibernate一对一关联关系的详细解释,通过理解和掌握这些知识点,你可以更有效地在Java项目中设计和实现数据库模型,提高代码的可读性和维护性。希望这份资源能帮助你更好地理解和运用Hibernate框架。

    hibernate一对一实例

    在这个“hibernate一对一实例”中,我们将深入探讨如何在Hibernate中实现一对一的映射,并通过具体的代码示例来帮助理解。 一、一对一关联的概念 一对一关联意味着一个实体只与另一个实体的一个实例相关联,反之...

    hibernate一对一主键关联映射(单项关联)

    本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个实体类的一个实例对应另一个实体类的唯一实例。 首先,我们要明确一对一主键关联映射的基本...

    Hibernate一对一主键关联映射(双向关联)

    标题"Hibernate一对一主键关联映射(双向关联)"中的"主键关联"指的是两个实体通过共享相同的主键来建立关联。"双向关联"则意味着在两个实体类中,都可以直接访问到对方的实例,即在实体A中有一个对实体B的引用,...

    hibernate中的外键查询实现

    总的来说,通过上述步骤,我们利用Hibernate的外键查询功能实现了`br_basic`与`city_info`表之间的多对一关联查询,确保了数据的完整性和一致性。在实际开发中,这可以大大提高数据操作的效率和便捷性。

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate ORM - 一对一连接表关联关系

    标题"Hibernate ORM - 一对一连接表关联关系" 提示我们,这里主要讨论的是Hibernate ORM框架在处理数据库中一对一(One-to-One)关联映射的方法。Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者用...

    hibernate框架一对一测试案例

    在Hibernate中,一对一关联可以通过`@OneToOne`注解实现。下面我们将通过一个简单的例子来说明: 假设我们有两个实体类,一个是`Person`,表示人,另一个是`DriverLicense`,表示驾照。一个人只有一个驾照,而一个...

Global site tag (gtag.js) - Google Analytics