基于Annotation:
多方:
package com.stark.hibernate.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table(name="t_user")
public class User {
private int userId;
private String userName;
//private Group group;
@Id
@GeneratedValue
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
一方:
package com.stark.hibernate.model;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.Table;
@Entity
@Table(name="t_group")
public class Group {
private int groupId ;
private String groupName;
private Set<User> users= new HashSet<User>();
@Id
@GeneratedValue
public int getGroupId() {
return groupId;
}
public void setGroupId(int id) {
this.groupId = id;
}
public String getGroupName() {
return groupName;
}
public void setGroupName(String name) {
this.groupName = name;
}
/**
* One 代表Group,Many代表User ,我们需要在多的一方添加外键,如果不添加@JoinColumn(name="groupId"),将会生成一张t_group_t_user的中间表
* 否则将会在user表中自动添加groupId字段
* @return
*/
@OneToMany(cascade = { CascadeType.ALL})
@JoinColumn(name="groupId")
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
生成数据库DDL语句:
create table t_group (groupId integer not null auto_increment, groupName varchar(255), primary key (groupId))
create table t_user (userId integer not null auto_increment, userName varchar(255), groupId integer, primary key (userId))
alter table t_user add index FKCB63CCB65F00FCD6 (groupId), add constraint FKCB63CCB65F00FCD6 foreign key (groupId) references t_group (groupId)
@Test
public void saveGroup() {
Session session = sessionFactory.openSession();
session.beginTransaction();
Set<User>users= new HashSet<User>();
User u1= new User();
u1.setUserName("wu");
users.add(u1);
User u2= new User();
u2.setUserName("wy");
users.add(u2);
Group g =new Group();
g.setGroupName("student");
g.setUsers(users);
session.save(g);
session.getTransaction().commit();
session.close();
}
Hibernate: insert into t_group (groupName) values (?)
Hibernate: insert into t_user (userName) values (?)
Hibernate: insert into t_user (userName) values (?)
Hibernate: update t_user set groupId=? where userId=?
Hibernate: update t_user set groupId=? where userId=?
PS:我在OneToMany中添加了cascade = { CascadeType.ALL},所有不用先保存User了,但是感觉在实际项目开发中如User定已经先保存在数据库中了
@Test
public void getGroup(){
Session session = sessionFactory.openSession();
session.beginTransaction();
Group g=(Group) session.get(Group.class, 2);
System.out.println("groupId:"+g.getGroupId());
System.out.println("groupName:"+g.getGroupName());
Set<User>users=g.getUsers();
for(User u:users){
System.out.println("userId:"+u.getUserId());
System.out.println("userName:"+u.getUserName());
}
session.getTransaction().commit();
session.close();
}
执行结果为:
groupId:2
groupName:student
Hibernate: select users0_.groupId as groupId1_, users0_.userId as userId1_, users0_.userId as userId1_0_, users0_.userName as userName1_0_ from t_user users0_ where users0_.groupId=?
userId:2
userName:wy
userId:1
userName:wu
基于XML:
去掉User和Group中@注解
Group.hbm.xml:
<?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="com.stark.hibernate.model">
<class name="Group" table="t_group">
<id name="groupId" >
<generator class="native"/>
</id>
<property name="groupName"/>
<set name="users">
<key column="groupId"></key>
<one-to-many class="User"/>
</set>
</class>
</hibernate-mapping>
User.hbm.xml:
<?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="com.stark.hibernate.model">
<class name="User" table="t_user">
<id name="userId">
<generator class="native"/>
</id>
<property name="userName" />
</class>
</hibernate-mapping>
生成数据库DDl语句:
create table t_group (groupId integer not null auto_increment, groupName varchar(255), primary key (groupId))
create table t_user (userId integer not null auto_increment, userName varchar(255), groupId integer, primary key (userId))
alter table t_user add index FKCB63CCB65F00FCD6 (groupId), add constraint FKCB63CCB65F00FCD6 foreign key (groupId) references t_group (groupId)
至于查询部分跟Annotation方法是相同的
- 大小: 6 KB
分享到:
相关推荐
在本教程中,我们将探讨如何使用注解和XML配置实现Hibernate的一对多单向关联。 首先,让我们理解一对多关联的概念。在数据库中,一对多关联意味着在一个表(父表)中的一个记录可以对应另一个表(子表)中的多个...
以上就是使用Hibernate通过注解和XML配置实现多对一单向关联的详细步骤。在实际开发中,这种关联方式能够有效地简化数据操作,提高代码的可读性和可维护性。注意,根据项目需求,你可能还需要处理关联的懒加载或立即...
- 使用`@ManyToOne`注解进行多对一映射配置。 - **一对多映射**: - 使用`@OneToMany`注解进行一对多映射配置。 - **多对多映射**: - 使用`@ManyToMany`注解进行多对多映射配置。 - **次级表映射**: - 使用`...
7. **注解映射(Annotation Mapping)**:使用Java注解替代XML映射,更简洁直观,例如`@ManyToOne`表示多对一的关联。 8. **SessionFactory**:Hibernate的核心工厂类,用于创建Session对象。 9. **Session**:是...
- **@ManyToOne**: 多对一关联,通常需要配合`@JoinColumn`指定关联信息。 - **@ManyToMany**: 多对多关联,需要通过中间表实现,使用`@JoinTable`定义中间表。 5. **懒加载与立即加载(@LazyCollection)** - `@...
- **多对一–单向** - **对象模型图**:表示多个对象与一个对象之间的关系。 - **关系模型**:在数据库中表示这种关系的方式。 - **关联映射的本质**:在对象模型中建立关系,在数据库中使用外键进行连接。 - **...