hibernate的一对一关联映射有两种方式,一种是基于外键的,一种是基于主键的。
一、基于外键的
人和身份证,由person来维护
Person
@OneToOne
@Cascade(CascadeType.ALL)
@JoinColumn(name="cardid")
private IDCard idCard;
IDCard
@OneToOne(mappedBy="idCard")
private Person person;
二、基于主键的
丈夫和妻子共享一个主键
Husband
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column
private String name;
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn//两端都要加
private Wife wife;
Wife
@Id
@GeneratedValue(generator="idGenerator")//生成器的名称
@GenericGenerator(name="idGenerator",//生成器名称
strategy="foreign",//hibernate的外键策略
parameters={@Parameter(name="property",value="husband")})//指定成员属性husband所属类的主键当做本类的主键,property是固定的
private int id;
@Column
private String name;
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn//如果不加这个注解,hibernate生成的sql会多一条husband_id属性
private Husband husband;
测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class HusbandDaoTest {
@Autowired
private HusbandDao dao;
@Test
public void testSave(){
Husband husband = new Husband();
Wife wife = new Wife();
husband.setName("lilei");
wife.setName("hanmeimei");
husband.setWife(wife);
wife.setHusband(husband);
dao.save(husband);
}
}