Hibernate注解 many to many

Mybatis巧用@Many注解让一条SQL联合查询语句完成一对多查询 Mybatis巧用@Many注解, 一个SQL联合查询语句搞定一对多查询! 阅读详情

Course 类

@Entity
@Table(name="t_course")
public class Course extends BaseEntity {

    private String name;

    /*@ManyToMany(cascade=CascadeType.PERSIST)
    @JoinTable(
            name="undergraduate_course",
            joinColumns=@JoinColumn(name="course_id"),
            inverseJoinColumns=@JoinColumn(name="undergraduate_id")
    )*/
    @ManyToMany(mappedBy="courses")
    private Set<UnderGraduate> underGraduates;

    public Set<UnderGraduate> getUnderGraduates() {
        return underGraduates;
    }

    public void setUnderGraduates(Set<UnderGraduate> underGraduates) {
        this.underGraduates = underGraduates;
    }

    public Course() {
        super();
        // TODO Auto-generated constructor stub
    }

    public Course(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Course [name=" + name + "]";
    }

}

UnderGraduate 类

@Entity
@Table(name="t_undergraduate")
public class UnderGraduate extends BaseEntity {

    private String name;

    //@ManyToMany
    //如果直接写个ManyToMany则默认生成的中间表的名字为:当前实体类对应的表的名字_对方实体类对应的表的名字
    //中间表中第一个字段为当前实体对应的表的名字_id
    //中间表中第二个字段的名字为当前对象的复杂属性_id

    @ManyToMany(cascade=CascadeType.PERSIST)
    //指定生成中间表的名字,此时中间表中生成的字段和前面的规律一样
    //如果想手工指定中间表中的字段则需要下面的操作
    @JoinTable(
            name="undergraduate_course",//指定生成中间表的名字
            joinColumns=@JoinColumn(name="undergraduate_id"),
            inverseJoinColumns=@JoinColumn(name="course_id")
        )
    private Set<Course> courses;

    public Set<Course> getCourses() {
        return courses;
    }

    public void setCourses(Set<Course> courses) {
        this.courses = courses;
    }

    public UnderGraduate() {
        super();
        // TODO Auto-generated constructor stub
    }

    public UnderGraduate(String name) {
        super();
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "UnderGraduate [name=" + name + "]";
    }

}

测试类

public class HibernateDemo01 {

    public static void main(String[] args) {
        add();

        UnderGraduate underGraduate=queryUnderGraduate(1);
        System.out.println(underGraduate);
        System.out.println("选修课程:");
        for(Course course:underGraduate.getCourses()){
            System.out.println(course);
        }

        System.out.println("====================");

        Course course=queryCourse(1);
        System.out.println(course);
        System.out.println("选修这门课程的大学生:");
        for(UnderGraduate graduate:course.getUnderGraduates()){
            System.out.println(graduate);
        }
    }



    private static Course queryCourse(int id) {
        Session session=null;
        try{
            session=HibernateUtils.getSession();
            Course course=(Course) session.get(Course.class,id);
            Hibernate.initialize(course.getUnderGraduates());
            return course;
        }finally{
            HibernateUtils.close(session);
        }
    }



    /**
     * 根据id查询大学生
     * @param id
     * @return
     */
    private static UnderGraduate queryUnderGraduate(int id) {
        Session session=null;
        try{
            session=HibernateUtils.getSession();
            UnderGraduate underGraduate=(UnderGraduate) session.get(UnderGraduate.class,id);
            Hibernate.initialize(underGraduate.getCourses());
            return underGraduate;
        }finally{
            HibernateUtils.close(session);
        }

    }



    /**
     * 添加数据
     */
    private static void add() {
        Session session=HibernateUtils.getSession();

        Transaction transaction=null;
        try{
            transaction=session.beginTransaction();

            UnderGraduate underGraduate=new UnderGraduate("小丽");
            Set<Course> courses=new HashSet<>();

            Course java=new Course("Java");
            courses.add(java);

            Course c=new Course("C#");
            courses.add(c);
            underGraduate.setCourses(courses);
            session.persist(underGraduate);

            /*System.out.println("============");
            UnderGraduate underGraduate_long=new UnderGraduate("小龙");
            Set<UnderGraduate> underGraduates=new HashSet<>();
            underGraduates.add(underGraduate);
            underGraduates.add(underGraduate_long);

            c.setUnderGraduates(underGraduates);
            session.persist(c);

            */
            transaction.commit();
        }finally{
            HibernateUtils.close(session);
        }



    }

}
Mac新手必看:nvm安装全攻略(含常见错误解决方案) 本文为Mac开发者提供nvm安装与使用全攻略,涵盖环境准备、安装步骤、Shell配置优化及常见错误解决方案。详细讲解如何利用nvm管理多Node版本,提升开发效率,特别针对国内用户提供网络问题解决技巧,是Mac新手必备的Node版本管理指南。 阅读详情

相关推荐

若依RuoYi文件上传漏洞实战:如何安全配置/profile/upload路径(附避坑指南)

本文深入解析若依RuoYi框架中/profile/upload路径的文件上传漏洞,提供详细的安全配置方案和实战指南。通过权限修正、输入验证强化和存储隔离等多层防御策略,有效防范未授权访问和恶意文件上传风险,保障系统安全。

pink的博客 778

Spring Jpa ManyToMany(多对多)关系中的cascade={CascadeType.X} 的配置与总结(好文章!!不看会踩坑,必看!)

角色表 用户表 中间表 CascadeType.MERGE 新增账户并添加不存在的角色,Jpa执行的语句 可以看到首先对role角色表进行了查询,不存在就添加一个角色。 Hibernate: select role0_.role_id as role_id1_4_0_, role0_.role_name as role_nam2_4_0_ from role role0_ where role0_.role_id=?Hibernate: insert into user (user_na

HD243608836的博客 961

风控要略-互联网业务反欺诈之路(一)

当前中国互联网安全产业答题可以分为基础安全和业务安全两个领域。从互联网诞生至2014年,互联网安全行业关注的热点基本都聚焦在网络安全、系统安全和应用安全这个三大基础安全领域上,“DDOS“(分布式拒绝服务攻击)1、“漏洞“、“拖库“2和“挂马“3等大家耳熟能详的术语也是从这些领域中衍生出来的。2014年前后,随着互联网业务的爆炸式发展,黑产团伙开始从“攻击渗透系统“的传统套路进化到“利用业务风控确实进行大规模牟利“的模式,并且逐渐形成规模庞大、分工明确的黑色产业链。

Despacito1006的博客 1012

@OneToMany、@ManyToOne以及@ManyToMany讲解

双向一对多关系,一是关系维护端(owner side),多是关系被维护端(inverse side)。在关系被维护端需要通过@JoinColumn建立外键列指向关系维护端的主键列。     publicclass Order implements Serializable {     privateSet&lt;OrderItem&gt; orderItems = new HashSet&...

dom_ee的博客 1922

基础矩阵、本质矩阵、单应矩阵

基础矩阵是一个 3×3 的秩为2的矩阵,用于描述两个不同视图(或称为图像)之间对应点的几何约束。更具体地说,如果你有两幅图像,分别从两个不同的相机或者相机位置拍摄,那么基础矩阵可以用于找到一个图像中的点在另一个图像中的对应点。本质矩阵也是一个 3×3 的秩为2的矩阵,与基础矩阵非常类似。当两个视图(图像)之间的场景是一个平面或者两个视图之间仅有旋转和平移时,可以使用单应矩阵来关联这两个视图。这三个矩阵都是在计算机视觉中广泛应用的基础工具,但它们适用于不同类型的视图和场景。给定两个图像中的一对对应点。

Gloamirror的博客 1327

Python量化交易实战:从零搭建你的第一个多因子选股模型(附完整代码)

本文是一份详细的Python量化交易入门实战指南,手把手教你从零搭建第一个多因子选股模型。内容涵盖环境配置、数据获取、因子挖掘与有效性检验、多因子合成以及完整的策略回测与绩效评估,并附有可直接运行的完整代码,帮助初学者快速掌握量化交易的基本概念与实践流程。

resnet7explorer的博客 931

hibernate单向多对多映射(many-to-many)XML与注解版

多对多关联映射需要新增加一张表才完成基本映射,他的实例场景如下: 用户与他的角色(一个用户拥有多个角色,一个角色还可以属于多个用户) 多对多关联映射,需要一个中间表,两个表中的主键放到第三张做一个关联,用第三张表来解决可能会造成数据冗余的问题,多对多的关联映射,在实体类中,跟一对多一样,也是用集合来表示的。

fendo 4498

2.4G射频微带线阻抗匹配设计实战(WiFi/BLE)

本文深入探讨了2.4G射频微带线阻抗匹配在WiFi/BLE产品开发中的关键作用。文章详细解析了共面波导微带线结构,提供了基于SI9000工具的阻抗计算实战指南,并总结了不同PCB板厚下的设计参数对照表。同时,文章分享了PCB布局布线、与板厂沟通以及天线匹配调试等核心避坑经验,旨在帮助硬件工程师构建从射频芯片到天线的稳定高效传输通道。

j0k1l2m3n的博客 367

Hibernate注解之@ManyToMany

当两个类(a,b)使用@ManyToMany注解时,会产生一个中间表a_b,该中间表表示两个类的关联关系,此时有两种情况:只有一端(类)维护该关联关系,两端(类)均可维护该关联关系。现有一新闻类Label和一标签类News,其为多对多的关系,使用@ManyToMany注解情况一:只有一端(类)维护该关联关系若仅News端可维护该关联关系,则意为只能通过向News类对象的集合属性labels中添加La

qq_37720278的博客 4037

OpenCLI入门:让任何网站变成你的命令行工具(超详细版)

最有用的工具,往往是最简单的。 opencli就是这样。 它不会帮你写代码,不会帮你做决策,但它能把200+个平台装进你的命令行。 让你用最简单的方式,获取最丰富的数据。

weixin_66295112的博客 2088

【人工智能】提示词避坑指南:为什么大模型越让它“禁止”,它越要“唱反调”?

和 AI 沟通就像和聪明但直脑筋的工科生说话——

奶爸的编程之路,也就一周冷个三天 224

Hibernate的注解many-to-one

Hibernate的注解many-to-one   Hibernate 学习应用 項目中一個實例:    最近使用annotation做hibernate映射,有两张表乘客(Passanger)表 和订单(VacationOrder )表,乘客表和订单表是ManyToOne,业务只需要从订单表出发设置不同乘客,根据乘客查看预订的订单,采用双向关联,ManyToOne

jerry191的博客 3903

【QT开发教程】如何在Qt中使用Protobuf进行高效数据序列化

Protocol Buffers(Protobuf)是Google开发的一种语言中立、平台中立、可扩展的序列化机制,常用于数据交换和存储。Qt作为一个跨平台的C++图形用户界面应用框架,可以与Protobuf结合使用,实现高效的数据序列化和反序列化。本文将介绍如何在Qt中集成和使用Protobuf,包括基本概念、安装步骤、使用示例以及实际应用。

科技改变人类,技术成就未来 1439

Hibernate注解实现one-to-many双向关联的实例演示

  如何注解的方式实现one-to-many 、many-to-one的双向关联配置以及实体CRUD基本操作, 详见:http://www.micmiu.com/j2ee/hibernate/hibernate-one-to-many-bidirectional-crud/   ---- ...

Michael 299

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用注解的Hibernate many-to-many映射

many to many映射是在两个实体间,一个实体可以和其他的多个实体建立关系。例如一个捐赠服务的实体Subscription实体和读取实体都是两个实体,一个捐赠可以有多个读者,一个读者可以有多个捐赠,在这篇文中我们将会学习在Hibernate3中怎么建立这种关系。 提出解决方案 为了演示多对多的关系,我们连接两个实体Reader实体和Subscription实体。他们的实体关系如下:

maoyeqiu的专栏 6175

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

hibernate注解版关联映射Many-to-One/Many-to-Many等&异常处理

链接:http://blog.youkuaiyun.com/superdog007/article/details/8534443 属性介绍: 1.多对一: span style="font-size:16px;">@ManyToOne(fetch=FetchType,cascade=CascadeType)span>   @ManyToOne表示一个多对一的映射,该注

xn_28的专栏 1万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

hibernate one-to-many many-to-one 双向注解

原文地址: http://www.cnblogs.com/fancyzero/archive/2012/06/10/hibernate-many-to-one_one-to-many-annotation.html 环境: Hibernate 3.3.1 Maven 3.0.4 MySQL 5.5.13 Myeclipse 8.6.1 建表语句: DROP

东方白 756

[Hibernate]基于xml和annotation的many-to-many双向关联【学习笔记】

基于xml的many-to-many双向关联的关键配置: many2many(xml):双向关联 |--->model |--->Student |--->private Set courses = new HashSet(); |--->Course |--->private Set students = new HashSet(); |--->*.hb

gSilenceQin的专栏 822

Hibernate基于注解的双向one-to-many映射关系的实现

在项目中用到了一对多的实体类关系映射,之前接触的都是基于配置文件的映射实现,但是公司的大部分都是基于注解的,因此自己参考之前的代码捣鼓了基于注解的一对多的映射关系实现。 背景: 一的一端:QingAoCenterInfo:青奥场所信息, 多的一端:QingAoPlaceInfo:青奥场馆信息, 其中一个青奥场所下可以包含多个青奥场馆 one端:QingAoCenterIn

生命在于折腾 3345

使用注解的Hibernate one-to-many映射

One to many映射关系指的是两个实体间一个实体可以和多个实体有关联关系,但是多的这一端只能和一的这一端的一个实例有关系。它是一个1 到 n的关系。例如在任何的公司员工可以注册多个银行账户,一个银行账户只能和一个员工相关联,在这篇文章中我们将会学习怎么在Hibernate3中建立这种映射关系。 问题陈述 我们要写两个实体一个是Employee实体另一个是Account实体,这样多个银行账

maoyeqiu的专栏 9797

hibernate中many-to-one的not-found属性和@notfound注解

如果在Hibernate项目里面配了很多many-to-one的关联,即使后台在查询数据时已经作了健全性判断,但还是会经常抛出对象找不到异常:org.hibernate.ObjectNotFoundException: No row with the given identifier exists。 比如系统在用户的使用过程中,数据库表的数据会常发生变化,最常见的是人员变化,原先引用的...

weixin_30597269的博客 753
上一篇: Hibernate one-to-one
下一篇: Hibernate 二级缓存
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值