`

关系/对象映射 多对多关系(@ManyToMany 注释)

阅读更多
查了好多资料

old:

@ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。
例如,在Student类中有如下方法:
被控方:
            @ManyToMany(fetch = FetchType.LAZY, mappedBy = "students")
public Set<Teacher> getTeachers() {
return teachers;
}
那么这里的“students”就是Teachers的一个属性,通常应该是这样的:
Set<Student> students;
另一端的getStudents方法如下所示:
主控方:
             @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")})
public Set<Student> getStudents() {
return students;
}
@ManyToMany 注释表示Teacher 是多对多关系的一端。@JoinTable 描述了多对多关系的数据表关系。name 属性指定中间表名称,joinColumns 定义中间表与Teacher 表的外键关系。上面的代码中,中间表Teacher_Student的Teacher_ID 列是Teacher 表的主键列对应的外键列,inverseJoinColumns 属性定义了中间表与另外一端(Student)的外键关系。

可以通过上面的定义看到有三个表学生表--老师表--老师学生中间表
以上提到主控方和被控方。。本人不赞同这种写法:
理由是: 1.既然是多对多关系。。为什么还要分主动方和被动方?
              2.为什么需要删除老师后才级联中间表。。。请注意:以上定义方法时,删除学生是无法级联删除中间表的。
正确的写法应该是两边都用主控方的写法:
只是joinColumns和inverseJoinColumns属性的地方互换就可以了
new:(个人观点,,欢迎大家一起来讨论此问题)
总结:
个人的定义:
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName = "studentid")},
inverseJoinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName ="teacherid")})
public Set<Teacher> getTeachers() {
return teachers;
}
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinTable(name = "Teacher_Student",
joinColumns = {@JoinColumn(name = "Teacher_ID", referencedColumnName = "teacherid")},
inverseJoinColumns = {@JoinColumn(name = "Student_ID", referencedColumnName ="studentid")})
public Set<Student> getStudents() {
return students;
}
分享到:
评论
2 楼 xman_bsn 2012-07-27  
刚刚试验了双主控的写法,果然有效!谢谢分享!
1 楼 mengz 2010-09-19  
非常感谢, 传统的写法被控方删个数据累的要死,这种就舒服多了 

相关推荐

    hibernate(多对多关系映射)

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系映射是一种常见的数据库交互模式,它用于表示两个实体之间复杂的关系。在这个场景中,一个实体可以与多个其他实体相关联,反之亦然。例如,在学生和课程...

    hibernate中的注释学习,以及注释帮助

    2. `@ManyToMany`: 表示多对多的关系,通常需要一个中间表来维护两个实体之间的关系。 ```java @Entity public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @...

    Java注释全解文档.zip

    - `@OneToMany`、`@ManyToOne`、`@OneToOne`、`@ManyToMany`:定义对象关系映射。 - `@Transient`:标记为非持久化字段。 4. **Struts2注解** - `@Action`:定义一个Action类,关联URL和执行方法。 - `@Results...

    hibernate注释源程序

    6. **@ManyToOne, @OneToMany, @OneToOne, @ManyToMany**: 这些注解用于定义对象间的关联关系,例如一对一、一对多、多对一和多对多。 7. **@JoinColumn**: 在关联关系中,用于指定外键所在的列。 8. **@Temporal*...

    JAP(java持久化注释).rar

    - `@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`: 这些注解用于处理对象间的关联关系,如一对一、一对多、多对一和多对多关系。 - `@JoinColumn`: 用于定义外键列,指定关系的引用字段。 4. **查询** ...

    Hibernate 注解大全

    9. `@ManyToMany`: 表示多对多关系,通常需要通过中间表进行映射。 ```java @ManyToMany @JoinTable(name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name ...

    Hibernate集合关系映射及one-one,one-many,many-many示例(带注释)

    本程序包含: hibenate 上传图片,二进制数据,大文本,集合映射的多种关系,onetoone,ontomany,manytomany等关系详细代码示例以及注释,全部由本人测试通过,对理解hibernate配置有极大帮助。

    hibernate-commons-annotations-3.1.0.GA

    例如,@ManyToOne表示一对多的关系,@OneToOne表示一对一的关系,@OneToMany则用于处理多对一的关联,而@ManyToMany则用于处理多对多的复杂关联。这些注解使得对象关系的映射变得直观且易于维护。 此外,该版本还...

    struts2+hibernate+Spring 框架 关于注释用法说明

    Hibernate的注解则主要用于定义模型类和数据库表之间的关系,使得ORM(对象关系映射)更加便捷。 理解并熟练掌握这些注解的用法,能极大地提高开发效率,减少XML配置文件的复杂度,使代码更加清晰和易于维护。在...

    annotated:使用带注释的实体和映射器生成模式

    循环ORM-带注释的实体 例子: /** * @Entity(repository = "Repository/UserRepository") */ class User { /** @Column(type="primary") */ protected $ id ; /** @HasOne(target=Profile::class, load=...

    annotation(注释)版本的hibernate

    本文将深入探讨"注释版本的Hibernate",结合具体实例,帮助读者理解如何使用注解来实现对象关系映射(ORM)。 一、Hibernate概述 Hibernate是一个开源的对象关系映射框架,它允许开发者用面向对象的方式处理数据库...

    hibernate-annotations-3.4.0.GA and hibernate-entitymanager-3.4.0.GA

    - `@OneToMany`, `@ManyToMany`: 描述多对一或多对多的关系,通常配合`@JoinTable`定义关联表。 - `@JoinColumn`: 定义外键字段,包括外键名、引用的列名等。 4. **实体生命周期管理** - `@PrePersist`, `@...

    hibenate实例

    Hibernate提供了多种映射策略,如单一映射、多对一、一对多、多对多等,满足不同数据关系的映射需求。例如,`@OneToOne`、`@ManyToOne`、`@OneToMany`、`@ManyToMany`等注解用于标注实体类之间的关系。 在`jee2-...

    EJB3.0注释小结

    8. **@OneToMany**、**@ManyToOne** 和 **@OneToOne**:这些注解用于声明一对多、多对一和一对一的关系。可以设置`mappedBy`、`cascade`和`fetch`属性来控制关联行为和懒加载。 9. **@Temporal(value=TemporalType....

    hibernate_test5.zip

    1. **关联映射**:通过`@OneToOne`、`@OneToMany`、`@ManyToOne`、`@ManyToMany`等注解定义实体间的关联关系。 2. **懒加载与即时加载**:使用`@LazyCollection(LazyCollectionOption.EXTRA)`实现懒加载,避免查询...

    oracle 表转实体类工具

    对于复杂的表关系,比如一对一、一对多、多对多关系,工具也能智能解析并生成关联的注解,如@OneToOne、@OneToMany、@ManyToMany等,确保实体类能够正确地反映出数据库中的关系。 例如,如果你有一个名为`employees...

    EJB.rar_EJB3_EJB3.0_ejb

    同时,`@GeneratedValue`用于自动生成主键,`@OneToMany`、`@ManyToOne`、`@ManyToMany`和`@OneToOne`用于处理多对一、一对多、多对多和一对一的关系。 ### 4. 依赖注入 依赖注入(DI)是EJB 3.0的另一个重要特性,...

    hibernate-core-4.3.5.final-javadocs-chm

    10. **关系映射**:Hibernate 支持一对一、一对多、多对一、多对多等各种关系映射,如 @OneToOne、@OneToMany、@ManyToOne、@ManyToMany。 11. **延迟加载(Lazy Loading)**:Hibernate 提供了懒加载机制,只在...

    传智播客JPA学习笔记修改免积分版

    - 支持 XML 和 JDK 5.0 注释两种形式,描述对象与数据库表间的映射关系,便于对象持久化至数据库表。 - **Java 持久化 API**: - 提供一系列用于操作实体对象的方法,如 CRUD 操作,使得开发者无需直接编写复杂的 ...

Global site tag (gtag.js) - Google Analytics