- 浏览: 1051029 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (1355)
- test (75)
- 红茶和绿茶 (1)
- Jave SE (206)
- Oracle (19)
- English (177)
- Log4j (5)
- RIA(Rich Internet Applications) (9)
- Ext Js (6)
- Android (14)
- Logo (0)
- 文字采撷 (287)
- 使用技巧 (92)
- Project Management (22)
- Hibernate (12)
- Struts (5)
- 规则引擎 (1)
- Html & Javasctipt (56)
- Spring MVC (10)
- Maven (17)
- Java Test (17)
- Linux (16)
- Tools (1)
- CV (0)
- Middleware (2)
- HTML5 (2)
- Algorithms (4)
- Web Service (15)
- 留学 (15)
- LADP (5)
- PXCOA (0)
- SysLog (6)
- SSO (3)
- Spring Security (4)
- Spring Batch (1)
- Jmail (1)
- Bible (4)
- Java Thread (5)
- Architect (6)
- github (2)
- Java Swing (12)
- NoSQL (7)
- UML (2)
- 敏捷(Agile) (7)
- Hudson+Maven+SVN (15)
- cloud computing (2)
- Bahasa Indonesia (1)
- jBPM (6)
- 民俗知识 (3)
- Consulting (1)
- Mysql (5)
- SAP (1)
- 微信公众平台接口开发 (3)
- 做生意 (1)
- 西餐 (1)
- Banking (1)
- Flex (0)
- 黄金投资 (1)
- Apache Tomcat 集群 (3)
- Hadoop (7)
- 需求分析 (1)
- 银行知识 (3)
- 产品管理 (2)
- 钢琴Music (3)
- 设计 (3)
- Marketing (2)
- US Life (3)
- 算法 (14)
- BigData (4)
- test红茶和绿茶Jave SEOracleEnglishLog4jRIA(Rich Internet Applications)Ext JsAndroidLogo文字采撷 (0)
- Design Pattern (5)
- NodeJS&AngularJS (9)
- Python (1)
- Spring boot (0)
- ACM (3)
最新评论
-
心往圣城:
微时代-最专业的微信第三方平台。LBS定位导航,微网站,自定义 ...
微信公众平台 /微信公众平台怎么用 -
zhaojiafan:
return ReverseStr1(str.substrin ...
逆转字符串 Write a String Reverser (and use Recursion!) -
zhaojiafan:
public class StringUtils {
p ...
逆转字符串 Write a String Reverser (and use Recursion!)
对hibernete只知道皮毛的偶,一直觉得在多表联合查询时配置hibernate数据表的映射文件很是麻烦的问题,最近难得有时间学习java annotation所以顺便更进一步的去学习一下hibernate,虽然我现在写这些东西在有好多人觉得是否开始有些过时,但是作为小鸟的我希望能将我的学习到的知识和经验与更多像我一样的小鸟们分享一下。那就废话少说了,这里我通过一个人员与角色的多对多实例,来与大家分享一下我的理解。
1.首先是一个User.java和Role.java的POJO类,代码如下:
(1) User.java
- package com.candy.hibernate.bean;
- import java.io.Serializable;
- import java.util.LinkedHashSet;
- import java.util.Set;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.Id;
- import javax.persistence.ManyToMany;
- import javax.persistence.Table;
- @Entity
- @Table(name="user")
- public class User implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- @Id
- @Column(name="user_id", length=7, nullable=false)
- private String id;
- @Column(name="user_name", length=20,nullable=false)
- private String name;
- @Column(name="user_pwd",length=20,nullable=false)
- private String password;
- @Column(name="user_addr",length=50)
- private String address;
- @Column(name="user_mail" ,length=20)
- private String email;
- @Column(name="head_img" ,length=50)
- private String headImage;
- @ManyToMany(mappedBy="users", fetch=FetchType.LAZY)
- private Set<Role> roles = new LinkedHashSet<Role>();
- public String getId() {
- return id;
- }
- public void setId(String id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getAddress() {
- return address;
- }
- public void setAddress(String address) {
- this.address = address;
- }
- public String getEmail() {
- return email;
- }
- public void setEmail(String email) {
- this.email = email;
- }
- public String getHeadImage() {
- return headImage;
- }
- public void setHeadImage(String headImage) {
- this.headImage = headImage;
- }
- public Set<Role> getRoles() {
- return roles;
- }
- public void setRoles(Set<Role> roles) {
- this.roles = roles;
- }
- @Override
- public String toString() {
- StringBuilder stb = new StringBuilder();
- stb.append("User[");
- stb.append("id:" + getId());
- stb.append(";name:" + getName());
- stb.append(";password:" + getPassword());
- stb.append(";email:" + getEmail());
- stb.append(";address:" + getAddress());
- stb.append("headImage:" + getHeadImage());
- stb.append("]");
- return stb.toString();
- }
- }
Role.java
- package com.candy.hibernate.bean;
- import java.io.Serializable;
- import java.util.LinkedHashSet;
- import java.util.Set;
- import javax.persistence.CascadeType;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.FetchType;
- import javax.persistence.Id;
- import javax.persistence.JoinColumn;
- import javax.persistence.JoinTable;
- import javax.persistence.ManyToMany;
- import javax.persistence.Table;
- @Entity
- @Table(name="role")
- public class Role implements Serializable {
- /**
- *
- */
- private static final long serialVersionUID = 1597271124780386657L;
- @Id
- @Column(name="role_id",length=7,nullable=false)
- private int id;
- @Column(name="role_name",length=10, nullable=false)
- private String role;
- @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
- @JoinTable(name="user_role",joinColumns={@JoinColumn(name="role_id")},inverseJoinColumns={@JoinColumn(name="user_id")})
- private Set<User> users = new LinkedHashSet<User>();
- @ManyToMany(mappedBy="roles")
- private Set<Priority> prioritys = new LinkedHashSet<Priority>();
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getRole() {
- return role;
- }
- public void setRole(String role) {
- this.role = role;
- }
- public Set<User> getUsers() {
- return users;
- }
- public void setUsers(Set<User> users) {
- this.users = users;
- }
- @Override
- public String toString() {
- StringBuilder stb = new StringBuilder();
- stb.append("Role[");
- stb.append("id:" + getId());
- stb.append(";role:" + getRole());
- stb.append("]");
- return stb.toString();
- }
- }
通过上面的java annotation,可以映射到三个表,分别为:
(1) @Table(name="user") :得到表名为user的数据表。
(2) @Table(name="role") :得到表名为role的数据表。
(3) @JoinTable(name="user_role",...)得到表名为user_role的多对多关系维护数据表。
同时,通过User.java的@ManyToMany(mappedBy="users",...)我们知道,主控方在Role.java,也就是说,当我们的Role发生delete这样的操作时,hibernate会自动的帮我们把user_role表中与该Role有关的所有数据给delete掉。总之,当对主控方进行操作时,对于中间表的维护要相对容易,所以在这我就不多说了。而对于被控方的操作,在对中间表的维护时,很多时候我们也需要维护中间关系表,下面就是我在对被控方操作时维护中间表的实例:
A. 添加一个拥有指定角色的用户。对于给一个用户添加角色,我们大脑首先会想到的是将该用户添加到指定角色的群组中,没错,就是这个思路,代码如下:
- public void addUser(User user) {
- try {
- for (Role role : user.getRoles()) {
- role.getUsers().add(user);
- }
- this.getHibernateTemplate().save(user);
- } catch (Exception e) {
- e.printStackTrace();
- logger.error("error occured at : ", e);
- }
- }
B.更新用户。
对于更新一个用户,对中间表的维护的思路跟上面的添加差不多,我的思路是先去掉该用户未被更新前的所有角色,再为该用户添加现有的角色,所以代码大致如下(下面的代码总感觉不太好,谁有好的写法,希望留言。我在这就先抛砖引玉了):
- public void updateUser(User user) {
- try {
- // update user's role
- User oldUser = (User) this.getHibernateTemplate().get(User.class,
- user.getId());
- if (oldUser != null) {
- for (Role role : oldUser.getRoles()) {
- role.getUsers().remove(oldUser);
- }
- for (Role role : user.getRoles()) {
- role.getUsers().add(oldUser);
- }
- this.getHibernateTemplate().save(oldUser);
- // update inverse table, the middle table has not been updated
- this.getHibernateTemplate().merge(user);
- }
- } catch (Exception e) {
- e.printStackTrace();
- logger.error("error occured at : ", e);
- }
- }
C.删除操作的思路也差不多,这里我就不多说了,代码如下:
- public void deleteUser(String primaryKey) {
- try {
- User user = (User) this.getHibernateTemplate().get(User.class,
- primaryKey);
- if (user != null) {
- // remove the relationship
- for (Role role : user.getRoles()) {
- role.getUsers().remove(user);
- }
- this.getHibernateTemplate().delete(user);
- }
- } catch (Exception e) {
- e.printStackTrace();
- logger.error("error occured at : ", e);
- }
- }
下面是hibernate生成的表对应的sql:
CREATE TABLE `user` (
`user_id` varchar(7) NOT NULL,
`user_addr` varchar(50) default NULL,
`user_mail` varchar(20) default NULL,
`head_img` varchar(50) default NULL,
`user_name` varchar(20) NOT NULL,
`user_pwd` varchar(20) NOT NULL,
PRIMARY KEY (`user_id`)
) ENG
CREATE TABLE `role` (
`role_id` int(11) NOT NULL,
`role_name` varchar(10) NOT NULL,
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `user_role` (
`role_id` int(11) NOT NULL,
`user_id` varchar(7) NOT NULL,
PRIMARY KEY (`role_id`,`user_id`),
KEY `FK143BF46AD86B0194` (`role_id`),
KEY `FK143BF46A7D95C574` (`user_id`),
CONSTRAINT `FK143BF46A7D95C574` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`),
CONSTRAINT `FK143BF46AD86B0194` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
好了,偶就能分享这么多了,希望对大家有用,有理解得不对的地方,欢迎大家批评指正。
Link:http://blog.csdn.net/shadow55/article/details/4428059
发表评论
-
Hibernate事务和并发控制
2016-01-15 04:21 520https://docs.jboss.org/hiberna ... -
HQL的嵌套子查询
2014-05-22 16:27 729一:嵌套子查询的概念:在SQL中,一个select-f ... -
SSH框架总结
2014-02-26 15:46 628首先,SSH不是一个框架 ... -
Criteria 和 DetachedCriteria的区别与使用
2013-10-17 11:48 871Criteria 和 DetachedCriteria ... -
hibernate hints oracle database
2012-10-19 14:46 916hibernate hints oracle database ... -
dataSource.hbm2ddl.auto=update
2012-02-10 11:22 1145dataSource.hbm2ddl.auto=update ... -
Hibernate之HQL
2011-12-15 13:36 1006HQL介绍 Hibernate中不使用SQL而是有自己的面向 ... -
HQL: Hibernate查询语言
2011-12-15 11:13 823Hibernate配备了一种非常强大的查询语言,这种语言看上去 ... -
testhibernate.zip
2011-12-14 22:58 901testhibernate.zip -
Hibernate映射的基本操作
2011-12-13 18:34 959Hibernate映射主要是通过对象关系映射文件实现,对象关 ... -
hibernate 中 对数据库中datetime类型的处理
2011-12-13 18:33 1908hibernate 中 对数据库中datetime类型的处理 ...
相关推荐
- XML映射文件包含了具体的SQL语句和结果映射,可以通过`<select>`, `<insert>`, `<update>`, `<delete>`标签进行CRUD操作。 3. 一对一关联映射 - 在实体类中定义一个关联对象的属性,并添加`@OneToOne`注解,...
更新(Update)操作对应`<update>`标签,删除(Delete)操作对应`<delete>`标签,它们的用法与`<insert>`类似,只是SQL语句不同。 接下来,我们来看双向一对一(OneToOne)关联关系。这种关系中,两个实体类之间...
下面我们将深入探讨GreenDao的基本使用,包括增删改查、一对一、一对多以及多对多关系的处理。 **1. 增删改查(CRUD)** - **创建(Create)**: 在GreenDao中,你需要定义一个实体类(Entity),这个类将对应...
例如,`insert()`方法用于插入数据,`delete()`用于删除,`update()`用于更新,而`query()`或`load()`用于查询数据。此外,还支持事务处理,保证了数据的一致性。 3. **对象关系映射**:GreenDao支持一对多、多对一...
2. `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`:这些注解用于定义实体间的关联关系,例如一对一、一对多、多对一和多对多。 3. `@Temporal`:用于处理日期和时间字段,可以指定日期、时间或日期时间...
- `@ManyToMany`: 多对多关系。 **4.6 集合相关的注解** - `@ElementCollection`: 映射集合属性。 - `@CollectionTable`: 定义集合属性对应的表。 - `@MapKey`: 映射 Map 的键。 **4.7 Cascade** - `@Cascade`: ...
在IT行业中,数据库管理和操作是不可或缺的部分,而Hibernate作为Java领域的一个强大ORM(对象关系映射)框架,极大地简化了数据库操作。Oracle则是一种广泛使用的商业级关系型数据库管理系统,尤其在大型企业中广泛...
- **CRUD 操作**:DBFlow 提供了简便的方法进行创建(Create)、读取(Read)、更新(Update)和删除(Delete)数据,如 `insert()`, `query()`, `update()`, `delete()`。 - **Query Language**:通过 SQL-like ...
在实体类的方法上直接使用 @Select、@Insert、@Update 和 @Delete 等注解来编写 SQL 语句。这种方式简洁明了,适合简单的数据操作,但对于复杂的查询可能需要写较多的注解。 2. **XML 方式**: SQL 语句写在对应...
JPA允许定义不同类型的实体关系,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。这些关系可以通过注解配置,如`@OneToOne`、`@OneToMany`等。 11. **实体监听器** ...
- **Relationships**:使用@OneToMany,@ManyToMany等注解处理一对多、多对多等关系。 - **Database Definitions**:通过@Database注解定义数据库,包括版本号、加密等配置。 3. **数据操作** - **Insertion**:...
8. **关联映射(Association Mapping)**:Hibernate支持多种关联类型,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany),通过这些关联,可以处理复杂的对象关系。...
- **删除(DELETE)**:使用`delete()`方法删除实体,Hibernate会执行`DELETE`语句。 5. **事务管理**:在进行数据库操作时,通常需要包裹在事务中,以确保数据的一致性。`Session`提供了`beginTransaction()`, `...
- **多对多关系(ManytoMany)** - 示例:`var results = from c in Customers join p in Products on c equals p.Customer select new { c, p };` - **自联接关系** - 示例:`var results = from p1 in Products ...
- **多对多关系(ManytoMany)**:`var query = from p in db.Products join c in db.Categories on p.CategoryID equals c.ID select new { Product = p.ProductName, Category = c.CategoryName };` - 连接产品表和...