`

Hibernate annotation配置方式的MappedBy使用详解

 
阅读更多

说是使用详解,其实是我自己做了一些简单的试验.如有说错,请指正.

 

Annotation方式的MappedBy其实就是xml方式的inverse

http://stackoverflow.com/questions/10082434/mappedby-and-inverse-attributes-are-same 写道
In case of one-one or one-many or many to one, the key will be stored in one of the entites. It does not make any sense to store it in 2 places.

It essential tells hibernate that the key is at the other end of the relationship.

So if there are entities A and B which have a one to one relationship, and you see the mappedBy attribute in A, then the foreign key (which points to A) is stored in B.

 

但是对于他们的行为 我一直不是很了解 hibernate里的doc解释也不是很清楚:

写道
inverse 映射属性究竟表示什么呢?对于你和 Java 来说,一个双向关联仅仅是在两端简单地正确设置引用。然而,Hibernate 并没有足够的信息去正确地执行 INSERT 和 UPDATE 语句(以避免违反数据库约束),所以它需要一些帮助来正确的处理双向关联。把关联的一端设置为 inverse 将告诉 Hibernate 忽略关联的这一端,把这端看成是另外一端的一个镜象(mirror)

 

其实简单点说 就是MappedBy确定"维护关系"的一方,也仅仅是"维护关系"而已.其他的操作不影响.

 

实验环境:hibernate 3.6.10.Final

实体类:User(多方) Classroom(一方) Many-to-One的测试

 

//多方:
    @ManyToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="cid")
    public Classroom getClassroom() {
	     return classroom;
    }
    public void setClassroom(Classroom classroom) {
	     this.classroom = classroom;
    }

 

//一方
	@OneToMany(mappedBy="classroom")
	public Set<User> getUsers() {
		return users;
	}
	public void setUsers(Set<User> users) {
		this.users = users;
	} 

 


 
 

从多方插入就不再累述了.

 

这里就试着从不维护关系的一方来插入:

		User user=new User();
		user.setUname("cc");
		user.setUpass("pass");
		Classroom cr=new Classroom();
		cr.setClassname("class one");
		
		Set<User> users=new HashSet<User>();
		users.add(user);
		cr.setUsers(users);

 这样只有一条插入语句:

Hibernate: insert into Classroom (cname) values (?)

 

 

为了更好地说明问题,我把以上一方的配置进行修改

加入了 cascade=CascadeType.ALL

同样执行以上代码 显示插入了两条:

Hibernate: insert into Classroom (cname) values (?)

Hibernate: insert into User (cid, uname, upass) values (?, ?, ?)

但是查看数据库就会发现:



 

虽然插入了..但是外键却没有值

一方不维护关系就可以明显的看出来,

 

但是一方的其他不影响关系的更新操作是没有问题的:

    	Classroom cr=(Classroom)session.get(Classroom.class, 1);
    	System.out.println(cr.getUsers().iterator().next().getUname());
    	cr.getUsers().iterator().next().setUname("XX");

 执行以上的代码:

显示:

Hibernate: select classroom0_.cid as cid1_0_, classroom0_.cname as cname1_0_ from Classroom classroom0_ where classroom0_.cid=?

Hibernate: select users0_.cid as cid1_1_, users0_.uid as uid1_, users0_.uid as uid0_0_, users0_.cid as cid0_0_, users0_.uname as uname0_0_, users0_.upass as upass0_0_ from User users0_ where users0_.cid=?

cc

Hibernate: update User set cid=?, uname=?, upass=? where uid=?

 

数据在数据库里也被正常更新

 

这样一番实验坐下来就可以很清楚的感觉到

mappedBy只是确定了由谁来维护关系而已 其他的操作并不影响.

 

一般情况下 如果要让两方都可以维护关系 我自己是在OneToMany后写JoinColumn 然后和ManyToOne里的外键列名取一样的。

当然也可以不写JoinColumn 来生成一个第三方表记录关系 但这样做没什么必要 相同的关系会被存两次.

 

 

  • 大小: 1.8 KB
  • 大小: 3.4 KB
  • 大小: 4.1 KB
0
1
分享到:
评论

相关推荐

    Hibernate Annotation应用

    《Hibernate Annotation应用详解》 在Java企业级开发中,Hibernate作为一个强大的对象关系映射(ORM)框架,极大地简化了数据库操作。而Hibernate Annotation是Hibernate框架的一部分,它允许开发者使用注解来配置...

    Hibernate annotation 详解

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) private List&lt;Order&gt; orders; ``` 这表示当用户对象被保存或删除时,关联的订单列表也会进行相应的操作。 7. **索引和唯一性约束(@Index, @...

    Hibernate一对多映射配置详解

    二、注解方式配置(Annotation) 1. 单向关联 使用注解配置时,可以在实体类的属性上直接添加`@ManyToOne`注解。 ```java @Entity public class Account { @Id private Integer id; // ... @ManyToOne(cascade...

    hibernate_annotation

    在Hibernate中,Annotation是用于替代传统XML配置的一种方式,提供了更加直观、简洁的代码表示。本文将深入探讨Hibernate Annotation,帮助读者理解和掌握这一强大的工具。 一、Hibernate Annotation基础 1.1 ...

    Hibernate annotation

    《Hibernate注解详解》 在Java的持久化框架中,Hibernate以其强大的功能和灵活的配置深受开发者喜爱。尤其是在ORM(对象关系映射)领域,Hibernate通过注解方式简化了传统XML配置,使得数据库操作更加直观易懂。...

    详解Hibernate一对一映射配置

    **二、注解方式配置(Annotation)** 1. **主键关联** 使用注解配置主键关联,可以如下所示: ```java @Entity public class Person { @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id;...

    HibernateAnnotations 中文版

    Hibernate Annotations 是 Hibernate 的一个重要组成部分,它引入了注解(Annotation)机制,使得开发者无需编写 XML 配置文件,就可以实现对象和数据库表之间的映射。 ### Hibernate ORM 基础 1. **对象关系映射...

    Hibernate 注解

    如果需要双向关联,Address类也需要有一个对User的引用,使用`mappedBy`属性指明关联的属性: ```java @OneToOne(mappedBy = "address") private User user; ``` 总的来说,Hibernate注解为开发者提供了更直观、更...

    hibernate_anoatation(中文版)

    随着Hibernate的不断更新和完善,注解(Annotation)逐渐成为配置实体类与数据库表映射的主要方式之一。本文将详细介绍Hibernate中的注解及其使用方法。 ### Hibernate注解概述 Hibernate注解是用于标记Java类或其...

    实体类注释避免配置xml文件

    例如,在`Department.java`中,`@OneToMany(mappedBy = "department")`表示`Department`与`Employee`之间是一对多的关系,其中`mappedBy`属性指定了关联的另一端,即`Employee`类中的`department`字段。 #### 3. 多...

    全注解SSH.

    #### 一、Hibernate Annotation详解 在Java开发领域,SSH(Struts + Spring + Hibernate)框架曾是Web应用开发的标准配置之一,其中Hibernate作为对象关系映射(ORM)工具,提供了强大的数据持久化功能。在现代的...

Global site tag (gtag.js) - Google Analytics