java inverse_映射中的inverse

映射中的inverse

首先要明确一点,inverse只存在于集合标记的元素中,Hibernate所提供的集合元素包括,

,,和.

inverse属性的作用是是否将对集合的修改反应到数据库中.也就是说当inverse="false"时,对

集合对象的修改会被反映到数据库中,而inverse="true"时,则不会对数据库进行相应的处理.

inverse的默认值是等于false.

inverse所描述的是对象之间关联关系的维护方式.

换个角度来理解,inverse属性的作用也可以理解为设置对象之间关联关系的维护方在哪一端.当

inverse="false"时,表明对象之间的关联关系由本方来进行维护.而当其inverse="true"时则表明对象

之间的关联关系由关联的另一方进行维护.

下面以一个例子说明

一对多关联关系

用户实体(User)和留言实体(Message)之间的一对多关联关系.

在User.hbm.xml配置文件中

...

...

保存实体的情况:

将inverse的值设为false,控制台输出的语句如下

(Message对象自己需要发出update语句来维护两者的关联关系)

Hibernate: insert into user (name, password, id) values (?, ?, ?)

Hibernate: insert into message (title, content, pubdate, user_id, id) values (?, ?, ?, ?, ?)

Hibernate: update message set user_id=? where id=?

当把inverse的值设置为true时,则上面的第三条SQL语句则不会发出.关联关系由User进行维护.

删除子对象的情况:

将inverse的值设为false,控制台输出的语句如下

Hibernate: update message set user_id=null where user_id=?

Hibernate: delete from message where id=?

同样将inverse的值设为true,则update语句不会发出.

多对多的关联关系

注:在设置多对多关系的inverse属性的时候,不能两个对象都将其设置为true,否则这两个对象就不能维护

两者之间的关系了.

用户实体(User)和角色(Role)之间的多对多关联关系

相关配置文件

User.hbm.xml

...

...

Role.hbm.xml

...

...

注意:在Role.hbm.xml配置文件中设置inverse="true"属性,因而User和Role两者之间的关系通过

User来进行维护.

保存实体情况:

...

User user = (User)session.get(User.class, "2c9ab2d514af5a3d0114af5a41f90001");

Role role = new Role();

user.getRoles().add(role);

session.save(role);

...

在运行的过程中,会执行以下语句

Hibernate: select user0_.id as id0_0_, user0_.name as name0_0_, user0_.password as password0_0_ from user user0_ where user0_.id=?

Hibernate: select roles0_.user_id as user1_1_, roles0_.role_id as role2_1_, role1_.id as id4_0_ from user_role roles0_ left outer join blog.role role1_ on roles0_.role_id=role1_.id where roles0_.user_id=?

Hibernate: insert into blog.role (id) values (?)

Hibernate: insert into user_role (user_id, role_id) values (?, ?)

可以看到.上面的第四条语句维护两个对象之间的关系.如果将上面的user.getRoles().add(role);改成

role.getUsers().add)(user);由于Role对象不是关系的维护方,在运行时就不会产生第四条语句,相应的

在第三方表user_role也会不插入相应的记录.

删除关联关系

...

User user = (User)session.get(User.class, "2c9ab2d514af5a3d0114af5a41f90001");

Role role = (Role)session.get(Role.class, "2c9ab2d514af97a60114af97abc60001");

user.getRoles().remove(role);

...

上面的代码的执行,不会删除任何JAVA对象,只会删除对象之间的关联关系.控制台输出的语句如下

......

Hibernate: delete from user_role where user_id=? and role_id=?

同样,如果将user.getRoles().remove(role);语句改换成role.getUsers().remove(user);则控制台

不会发出以delete语句.关联关系不会被删除.

posted on 2007-08-29 11:40 Ke 阅读(281) 评论(1)  编辑  收藏 所属分类: hibernate

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 的核心功能之一是 Java 对象和数据库表之间的映射,这是实现 ORM 的核心。Hibernate 提供了多种方式来进行对象和表之间的映射,包括 XML 映射文件、注解和 Java 代码映射等。无论使用哪种方式,Hibernate 的映射原理都是一致的。 Hibernate 的映射原理可以分为两个方面:对象属性和表列之间的映射、对象之间的关系映射。 1. 对象属性和表列之间的映射 在 Hibernate ,每个实体类都对应着一个数据库表,实体类的属性对应着数据库表的列。在使用 Hibernate 进行数据库操作时,Hibernate 会将实体对象的属性值映射到数据库表的列上,或将数据库表的列值映射到实体对象的属性上。Hibernate 的属性和表列之间的映射关系主要通过映射文件或注解来进行配置。 在映射文件,使用 <class> 标签定义实体类,使用 <property> 标签或 <id> 标签来定义属性,使用 <column> 标签来定义属性对应的数据库表列。例如: ```xml <class name="com.example.User" table="user"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="age" column="age" type="integer"/> </class> ``` 在注解,使用 @Entity 标注实体类,使用 @Column 标注属性对应的数据库表列。例如: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // 省略 getter 和 setter 方法 } ``` 2. 对象之间的关系映射 在 Hibernate ,实体类之间可以存在多种关系,包括一对一、一对多、多对一和多对多等。Hibernate 通过映射文件或注解来定义实体类之间的关系映射关系。 例如,一对多关系可以通过在多的一方的实体类定义一个集合属性来表示。在映射文件,使用 <set> 标签定义集合属性,使用 <one-to-many> 标签定义集合元素对应的实体类。例如: ```xml <class name="com.example.Order" table="orders"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <set name="items" inverse="true" lazy="true" cascade="all"> <key column="order_id"/> <one-to-many class="com.example.OrderItem"/> </set> </class> <class name="com.example.OrderItem" table="order_items"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="price" column="price" type="double"/> <many-to-one name="order" class="com.example.Order" column="order_id"/> </class> ``` 在注解,可以使用 @OneToMany 和 @ManyToOne 注解来定义一对多关系,使用 @JoinColumn 注解来定义外键。例如: ```java @Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> items; // 省略 getter 和 setter 方法 } @Entity @Table(name = "order_items") public class OrderItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "price") private Double price; @ManyToOne @JoinColumn(name = "order_id") private Order order; // 省略 getter 和 setter 方法 } ``` 总之,Hibernate 的映射原理是将 Java 对象和数据库表之间的属性和关系进行映射,通过映射文件或注解来进行配置。Hibernate 支持多种关系映射,包括一对一、一对多、多对一和多对多等,开发人员可以根据需要选择合适的映射方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值