首先,来看看ER关系图:
这个关系很好理解:一个雇员只有一条属于他/她的详细信息。
然后,来看看表结构:
CREATE TABLE employee_details
(
employee_id integer NOT NULL,
street character varying(200),
city character varying(200),
state character varying(200),
country character varying(200),
CONSTRAINT employee_details_pk PRIMARY KEY (employee_id),
CONSTRAINT employee_details_fk FOREIGN KEY (employee_id)
REFERENCES employee (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE employee
(
id integer NOT NULL,
first_name character varying(60),
last_name character varying(60),
full_name character varying(120),
email character varying(255),
cell_phone character varying(15),
age smallint,
sex smallint,
department_id integer,
CONSTRAINT employee_pk PRIMARY KEY (id)
)
请注意employee_details表中的主键和外键的设置。
最后来看看entity类:
首先是Employee类
@OneToOne(mappedBy = "employee", cascade = {CascadeType.ALL})
private EmployeeDetails employeeDetails;
然后是EmployeeDetails类
@OneToOne
@PrimaryKeyJoinColumn
private Employee employee;
需要注意下ID的设置
@Id
@Column(name = "employee_id", unique = true, nullable = false)
@GeneratedValue(generator = "gen")
@GenericGenerator(name = "gen", strategy = "foreign",
parameters = @Parameter(name = "property", value = "employee"))
private long employeeId;
这个把外键和对应的属性取值都映射清楚了。
你可以用以下测试代码:
public class HibernateTest {
private static SessionFactory sf;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
Configuration cfg = new Configuration();
cfg.configure();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry();
try {
sf = cfg.configure()
.addAnnotatedClass(Employee.class)
.buildSessionFactory(sr);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void test() {
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
Department d = new Department();
d.setName("development");
Role r = new Role();
r.setName("administrator");
r.setRank(1);
Role r1 = new Role();
r1.setName("owner");
r1.setRank(2);
EmployeeDetails ed = new EmployeeDetails();
ed.setCity("ShangHai");
ed.setCountry("China");
ed.setStreet("West YanAn Road #1118");
ed.setState("ShangHai");
EmployeeDetails ed1 = new EmployeeDetails();
ed1.setCity("ChengDu");
ed1.setCountry("China");
ed1.setStreet("xxxxxxxxxxxxxxxxxxxxxxx");
ed1.setState("ChengDu");
Employee e = new Employee();
e.setAge(33);
e.setSex(1);
e.setCellphone("86186xxxxxxx8");
e.setLastname("Tian");
e.setFirstname("Max");
e.setEmail("max.tian@xxx.com");
e.setDepartment(d);
e.setEmployeeDetails(ed);
Employee e1 = new Employee();
e1.setAge(33);
e1.setSex(1);
e1.setCellphone("86186xxxxxxx8");
e1.setLastname("Tom");
e1.setFirstname("Jackson");
e1.setEmail("tom.jackson@xxx.com");
e1.setDepartment(d);
e1.setEmployeeDetails(ed1);
ed.setEmployee(e);
ed1.setEmployee(e1);
e.getRoles().add(r);
e.getRoles().add(r1);
e1.getRoles().add(r);
s.save(e1);
s.save(e);
s.persist(d);
tx.commit();
s.close();
}
}