`

基于Annotation 的一对多ManyToOne单向和基于XML配一对多单向

阅读更多
基于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
分享到:
评论

相关推荐

    Hibernate Annotation 基于连接表的单向一对多关联

    标题中的“基于连接表的单向一对多关联”指的是在一对多关联中,通过一个额外的连接表来维护两个表之间的关系。这种关联方式通常用于两个实体之间没有直接的外键关联,而是通过第三个表来建立联系。 具体实现步骤...

    Hibernate一对多单向关联(annotation/xml)

    在本教程中,我们将探讨如何使用注解和XML配置实现Hibernate的一对多单向关联。 首先,让我们理解一对多关联的概念。在数据库中,一对多关联意味着在一个表(父表)中的一个记录可以对应另一个表(子表)中的多个...

    Hibernate Annotation 基于外键的单向多对一关联

    本篇文章将深入探讨如何使用Hibernate Annotation来实现基于外键的单向多对一关联。 在关系型数据库中,多对一关联是一种常见的关系类型,意味着一个实体(如表)可以与另一个实体有多条记录关联,而另一个实体只能...

    Hibernate多对多单向关联(annotation/xml)

    本篇将详细讲解如何使用Hibernate实现多对多单向关联,包括注解(Annotation)和XML配置方式。 一、多对多关联的基本概念 多对多关联意味着一个实体可以与多个其他实体关联,反之亦然。例如,学生和课程的关系,一...

    基于annotation 的ssh整合(1)

    接下来,你可以继续构建其他实体类,定义它们之间的关联,如一对多、多对一、一对一等关系,通过注解如`@OneToMany`、`@ManyToOne`和`@OneToOne`等。同时,你需要配置Spring以处理数据访问,可以使用`@Autowired`...

    Hibernate多对一单向关联(annotation/xml)

    以上就是使用Hibernate通过注解和XML配置实现多对一单向关联的详细步骤。在实际开发中,这种关联方式能够有效地简化数据操作,提高代码的可读性和可维护性。注意,根据项目需求,你可能还需要处理关联的懒加载或立即...

    Hibernate Annotation 基于外键的一对多双向关联

    在实现基于外键的一对多双向关联时,理解注解的含义和作用至关重要,同时还需要考虑性能优化和潜在的问题,确保数据的正确性和一致性。通过阅读源码和实践,我们可以更深入地掌握Hibernate的内在机制。

    Hibernate annotation JPA 一对多,多对多

    在本主题中,我们将深入探讨使用Hibernate注解来实现JPA的一对多、多对多和多对一的关系映射。 1. **一对多关系**: 在现实世界中,一个老师可以教多个学生,或者一个班级可以包含多个学生,这就是典型的一对多...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    在Java的持久化框架Hibernate中,一对多(Many-to-One)和多对一(One-to-Many)的关系映射是数据库关系模型中的常见关联类型。本文将深入探讨这两种关联方式在使用Hibernate时的配置,包括基于注解(Annotation)和...

    Hibernate一对一单向外键关联(annotation/xml)

    本篇将深入探讨Hibernate中的一对一单向外键关联,通过注解和XML配置两种方式进行实现。这种关联允许一个实体类与另一个实体类之间存在一对一的关系,并且只在其中一个实体类中维护这种关系。 首先,我们来理解一对...

    hibernate4.3.8的annotation及xml的一对多的双向案例

    在Java的持久化框架中,Hibernate是一个非常重要的工具,它提供了强大的对象关系映射(ORM)功能,使得开发者...此外,由于多对多关系可以转换为两个一对多关系,因此这个案例对于理解多对多关系的处理也有一定帮助。

    Hibernate一对多、一对一、多对多映射之Annotation篇.doc

    本文主要探讨了使用Hibernate Annotation实现的一对多、一对一和多对多映射关系。 一、一对多/多对一映射 在一对多关系中,一个实体(一方)可以与多个其他实体(多方)相关联。在Hibernate中,我们通过`@...

    基于annotation的aop实现

    基于Annotation的AOP实现是Spring框架的一个重要特性,它极大地简化了AOP的使用。在本篇文章中,我们将深入探讨基于Annotation的AOP实现,特别是动态代理的理念。 首先,了解什么是AOP。AOP的核心概念是“切面”...

    基于annotation s2sh实现零配置的CRM

    在基于Annotation的实现中,我们可以使用`@Action`和`@Result`注解来声明Action类及其对应的结果,避免了在struts.xml中的繁琐配置。 2. **Spring**:Spring框架负责管理对象的生命周期和依赖注入。通过`@Component...

    xml和annotation的优缺点

    xml和annotation的优缺点 对比介绍

    详解 Spring 3.0 基于 Annotation 的依赖注入实现

    详解 Spring 3.0 基于 Annotation 的依赖注入实现。。详解 Spring 3.0 基于 Annotation 的依赖注入实现。。

    基于Annotation的Servlet配置

    这篇博文"基于Annotation的Servlet配置"探讨了如何使用注解来配置Servlet,让我们深入理解这一现代Web应用开发中的重要概念。 首先,我们来看`@WebServlet`注解。这个注解是Java Servlet API的一部分,可以直接在...

    ssh包(基于annotation)

    SSH(Secure Shell)是一种网络协议,用于在不安全的网络上提供安全的远程登录和其他服务。在Java开发中,SSH通常指的是Spring、Struts和Hibernate这三个开源框架的组合,它们一起构建了强大的企业级应用程序。这里...

    基于Annotation的Java单元测试框架.pdf

    本文主要介绍了基于Annotation的Java单元测试框架,讨论了Annotation在Java EE中的应用、反射技术的使用和JUnit单元测试框架的结合,建立了一个自动化单元测试框架结构。 一、Annotation概述 Annotation是Java 5中...

    基于Annotation并对DAO层封装具有分页功能的S2SH整合实例

    在这个基于Annotation并对DAO层封装具有分页功能的S2SH整合实例中,我们将探讨如何利用这些技术的特性来提高开发效率和代码可维护性。 首先,让我们深入了解一下Struts2。Struts2是基于MVC模式的开源Web应用框架,...

Global site tag (gtag.js) - Google Analytics