Hibernate 一对一主键关联实例

来源:互联网 发布:域名管理权如何找回 编辑:程序博客网 时间:2024/06/08 23:58

有两个表,product (id ,name)
                    image(id,name)

其中image的主键id引用product的主键id,建立约束,形成1对1

下面的代码,将实现如下功能

(1)新建image对象,新建product对象,通过保存product对象,自动对image对象进行保存,并维护完成性约束

 

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

 

 

Image和Product的持久类,各持有对方的一个对象,形成1对1关系

 

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;
}

}

 

 

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);
        
        session.save(product);
          t.commit();

        System.out.println(
"success");

    }

 

持久类的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">
      
<column name="id"></column>
      
<generator class="uuid.hex"></generator>
    
</id>
    
<property name="name" column="name"></property>
    
<one-to-one name="image"
                class
="Image"
                cascade
="all"
                outer-join
="true">
    
</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="foreign">
        
<param name="property">product</param>
      
</generator>

    
</id>
    
<property name="name" column="name"></property>
     
<one-to-one name="product"
                 class
="Product"
                 cascade
="all"
                 outer-join
="true">
    
</one-to-one>
  
</class> 

</hibernate-mapping>

 

测试代码

其中product.setImage(image);
        image.setProduct(product); 很关键,如果写product,setImage(image)会报异常

    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);
        
        t.commit();
        Product product1
=(Product)session.get(Product.class"40288018114a1c4e01114a1c507e0001");
        System.out.println(product1);
        System.out.println(product1.getImage());
        

        System.out.println(
"success");

    }
原创粉丝点击