【Hibernate】之关于多对一单向关联映射
在项目的开发中多对一的单向关联映射是最常见的,关联映射!这个着重详细讲解一下!
例如,我们现在一个组(Group)和人(Person)
(Person表)
id | name |
1 | 张三 |
2 | 李四 |
(Group表)
id | name | p_id |
1 | 财务组 | 1 |
2 | 财务组 | 2 |
由上表我们发现,是不是出现数据的重复?财务组在重复!
所以,在多对一的单向映射中,我们通常是在多的一方加上外键来关联少的一方。
那么在这个关系中(Group)是少的一方,(Person)是多的一方,一个组里面可以有多个人!
(Group表)
id | name |
1 | 财务组 |
2 | 开发组 |
(Person表)
id | name | g_id |
1 | 张三 | 1 |
2 | 李四 | 1 |
上面这种关系才是正常的业务逻辑!
ok,下面来看我们的Annotations配置!
@Entity @Table(name="t_user") publicclass Person { private Integer id; private String name; private Integer age; private Group group; @ManyToOne public Group getGroup() { returngroup; } publicvoid setGroup(Groupgroup) { this.group = group; } @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="name") public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; } @Column(name="age") public Integer getAge() { returnage; } publicvoid setAge(Integerage) { this.age = age; } }
@Entity @Table(name="t_group") publicclass Group { private Integer id; private String name; @Id @GeneratedValue public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } @Column(name="name") public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; } }
XML配置方法
package csg.hibernate.entity; publicclass Person { private Integer id; private String name; private Integer age; private Group group; public Group getGroup() { returngroup; } publicvoid setGroup(Groupgroup) { this.group = group; } public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; } public Integer getAge() { returnage; } publicvoid setAge(Integerage) { this.age = age; } }
package csg.hibernate.entity; publicclass Group { private Integer id; private String name; public Integer getId() { returnid; } publicvoid setId(Integerid) { this.id = id; } public String getName() { returnname; } publicvoid setName(Stringname) { this.name = name; } }
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="csg.hibernate.entity"> <class name="Person" table="t_user"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <property name="age"/> <many-to-one name="Group" column="group_id"/> </class> </hibernate-mapping>
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="csg.hibernate.entity"> <class name="Group" table="t_group"> <id name="id"> <generator class="native"/> </id> <property name="name" /> </class> </hibernate-mapping>
到这里我们使用Junit测试一下
publicclass JuniTest { privatestatic SessionFactory sessionFactory; @BeforeClass publicstaticvoid beforeClass() { Configuration cfg=new Configuration(); cfg.configure(); sessionFactory=cfg.buildSessionFactory(); } @Test public void add(){ try { Group group=new Group(); Session session = sessionFactory.getCurrentSession(); session.beginTransaction(); group.setName("部门"); session.save(group); Person person=new Person(); person.setAge(12); person.setName("张三"); person.setGroup(group); session.save(person); session.getTransaction().commit(); } catch (HibernateException e){ e.printStackTrace(); } } @AfterClass publicstaticvoid afterClass() { sessionFactory.close(); } }
ok!