SQL:
--
花边
CREATE
TABLE
Lace ( id
INT
IDENTITY
, name
VARCHAR
(
10
)
NOT
NULL
UNIQUE
,
--花边名称
PRIMARY
KEY
(id) )
--
胚布
CREATE
TABLE
Cloth ( id
INT
REFERENCES
Lace(id),
--
花边
totalQuantity
INT
DEFAULT
0
NOT
NULL
,
--
总匹数
totalKg
DECIMAL
(
18
,
2
)
DEFAULT
0.0
NOT
NULL
,
--
总重量
PRIMARY
KEY
(id) )
花边跟胚布的关系是1 v 1 在Hibernate如何表达他们之间的关系? 步骤: 在各自的实体类里面相互包含,看代码( 注意红色部分):
//
Lace.java
/** */
/** * @author DoItPerfect * */
public
class
Lace
...
{ private int id; private String name; private Cloth cloth ; public Cloth getCloth() ... { return this .cloth; } public void setCloth(Cloth cloth) ... { this .cloth = cloth; } public int getId() ... { return this .id; } public void setId( int id) ... { this .id = id; } public String getName() ... { return this .name; } public void setName(String name) ... { this .name = name; } }
//
Cloth.java
import
java.math.BigDecimal;
/** */
/** * @author DoItPerfect * */
public
class
Cloth
...
{ private int id; private int totalQuantity; private BigDecimal totalKg; private Lace lace ; public int getId() ... { return this .id; } public void setId( int id) ... { this .id = id; } public Lace getLace() ... { return this .lace; } public void setLace(Lace lace) ... { this .lace = lace; } public BigDecimal getTotalKg() ... { return this .totalKg; } public void setTotalKg(BigDecimal totalKg) ... { this .totalKg = totalKg; } public int getTotalQuantity() ... { return this .totalQuantity; } public void setTotalQuantity( int totalQuantity) ... { this .totalQuantity = totalQuantity; } }
接下来编写映射文件:
<!--
Lace.hbm.xml
-->
<?
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"
>
<
hibernate-mapping
>
<
class
name
="Lace"
dynamic-insert
="true"
>
<
id
name
="id"
type
="int"
>
<
generator
class
="identity"
/>
</
id
>
<
property
name
="name"
/>
<
one-to-one
name
="cloth"
class
="Cloth"
cascade
="all /> <!-- 这里只需要指定one-to-one 对应的属性名称和类名即可,还要级联,否则一旦修改数据会丢失完整性.--> </class> </hibernate-mapping> <!-- Cloth.hbm.xml --> <?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"
>
<
hibernate-mapping
>
<
class
name
="Cloth"
dynamic-insert
="true"
>
<
id
name
="id"
type
="integer"
column
="id"
unsaved-value
="0"
>
<-- 这里是重点,首先Cloth表的主键字段(id)为Lace表的外健,所以要指定该主键为一个外健-->
<
generator
class
="foreign"
>
<!--指定当前实体(也就是Cloth)的哪个属性跟Lace关联-->
<
param
name
="property"
>
lace
</
param>
</
generator
>
</
id
>
<
property
name
="totalQuantity"
/>
<
property
name
="totalKg"
type
="big_decimal"
/>
<!-- constrained="true" 表示Cloth的主键参照Lace的主键-->
<
one-to-one
name
="lace"
class
="Lace"
constrained
="true"
/>
</
class
>
</
hibernate-mapping
>
接下来在hibernate.cfg.xml添加以上两个文件的映射.
最后测试...(懒得把代码改了看测试代码就能理解了,偶直接copy项目里面的)
/** */
/** * */
package
com.hts.mis.test.dao;
import
org.junit.After;
import
org.junit.Before;
import
org.junit.Test;
import
com.hts.mis.dao.ILaceDAO;
import
com.hts.mis.model.Cloth;
import
com.hts.mis.model.Lace;
import
com.hts.mis.util.DAOFactory;
import
com.hts.mis.util.HibernateUtil;
/** */
/** * @author DoItPerfect * */
public
class
TestOneLaceToOneCloth
...
{ /** */ /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception ... { HibernateUtil.getSessionFactory().getCurrentSession() .beginTransaction(); } /** */ /** * @throws java.lang.Exception */ @After public void tearDown() throws Exception ... { HibernateUtil.getSessionFactory().getCurrentSession().getTransaction() .commit(); } @Test public void testAddLaceAndCloth() ... { ILaceDAO dao = DAOFactory.getInstance().getLaceDAO(); Lace lace = new Lace(); lace.setName( " test " ); lace.setHandle(DAOFactory.getInstance().getHandleDAO().getAll().get( 3 )); Cloth cloth = new Cloth(); lace.setCloth(cloth); cloth.setLace(lace); dao.save(lace);
Assert.assertNotNull("save lace success!",lace.getId());
Assert.assertNotNull("save cloth success!",cloth.getId());
} }