有连个实体如下:
CREATE
TABLE
`product` (
`id`
varchar
(
50
)
NOT
NULL
,
`name`
varchar
(
50
)
default
NULL
,
PRIMARY
KEY
(`id`)
) ENGINE
=
InnoDB
DEFAULT
CHARSET
=
gb2312;
CREATE
TABLE
`product` (
`id`
varchar
(
50
)
NOT
NULL
,
`name`
varchar
(
50
)
default
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中一对一关联关系的实现方法,包括实体类定义、映射文件配置及测试代码示例。重点讲解了<one-to-one>标签中property-ref属性的作用。
756

被折叠的 条评论
为什么被折叠?



