- 浏览: 329526 次
- 性别:
- 来自: 北京
-
文章分类
- 全部博客 (211)
- Java IO (3)
- Struts (13)
- Hibernate (19)
- Spring (9)
- jQuery (2)
- Extjs (8)
- Flex (1)
- Oracle (4)
- ibatis (3)
- SQL (0)
- WorkFlow (0)
- Java Core (14)
- Ant&Maven (18)
- Java Thread (0)
- Java Socket (1)
- Java OO (2)
- Javascript (14)
- CSS&Div (2)
- MYSQL (3)
- MSSQL (0)
- Design Pattern (3)
- Data Structure&Algorithm (1)
- Source Analysis (0)
- OSGi (3)
- Linux (7)
- Network (1)
- 百无聊赖 (9)
- English (5)
- Japaness (0)
- French (0)
- Webservice (3)
- 考试认证 (0)
- C/C++ (1)
- 小题目 (1)
- Server (1)
- JSP&Servlet (18)
- JDBC (8)
- JMS (3)
- JNDI (0)
- 软件工程 (2)
- 项目管理 (2)
- UML (0)
- 文档翻译 (0)
- 架构之美 (1)
- EJB (0)
- DataBase Design (1)
- DataBase (1)
- Framework Integration (2)
- JPA (2)
- Daily Reading (8)
- 通用组件设计 (3)
- Spring DM (1)
- Spring MVC (0)
- Spring Security (0)
- 时间管理 (0)
- 成本管理 (1)
- 进度管理 (0)
- 质量管理 (0)
- 范围管理 (0)
- 环境配置 (5)
- 敏捷开发 (0)
- DB2 (2)
- 持续集成 (1)
- JVM性能调优 (2)
- Weblogic (0)
- PHP (1)
- Websphere (2)
最新评论
-
di1984HIT:
写的很好,谢谢。。
【转载】【权限控制】角色访问动态生成用户权限菜单树 -
paladin1988:
wangxuehui 写道我昨天也参加视频面试,视频面试2个人 ...
阿里巴巴面试感想 -
wangxuehui:
我昨天也参加视频面试,视频面试2个人,最后都听我说完啦,最后我 ...
阿里巴巴面试感想 -
paladin1988:
liwei113114 写道请问一下,你们最后是怎么解决tld ...
OSGi动态拔插,动态部署,动态权限菜单 -
liwei113114:
请问一下,你们最后是怎么解决tld那个问题的?
我现在也遇到这 ...
OSGi动态拔插,动态部署,动态权限菜单
写了这么几篇都是单向的关联,干脆后面的都写双向关联吧,今晚天就把Hibernate Annotation的问题都结了。
使用@OneToOne 注解可以建立实体bean之间的一对一的关联. 一对一关联有三种情况: 一是关联的实体都共享同样的主键, 二是其中一个实体通过外键关联到另一个实体的主键 (注意要模拟一对一关联必须在外键列上添加唯一约束). 三是通过关联表来保存两个实体之间的连接关系 (注意要模拟一对一关联必须在每一个外键上添加唯一约束).(摘自Hibernate Annotation Reference)
本篇是基于共享主键的方式来写的,顾名思义,共享主键即两个表使用一个主键。
数据库脚本:(见附件)
//User.java
package com.zyp.examples; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; /** * User entity. @author MyEclipse Persistence Tools */ @Entity @Table(name="user") public class User implements java.io.Serializable { // Fields private static final long serialVersionUID = 6210252824713630770L; @Id @Column(name="id") @GeneratedValue(generator="incrementGenerator", strategy=GenerationType.IDENTITY) @GenericGenerator(name="incrementGenerator", strategy="increment") private Integer id; @Column(name="name") private String name; @Column(name="password") private String password; @OneToOne(targetEntity=Profile.class, cascade={CascadeType.ALL}) //这里用的是PrimaryKeyJoinColumn,不是JoinColumn @PrimaryKeyJoinColumn private Profile profile; // Constructors /** default constructor */ public User() { } /** full constructor */ public User(String name, String password) { this.name = name; this.password = password; } // Property accessors public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getPassword() { return this.password; } public void setPassword(String password) { this.password = password; } public Profile getProfile() { return profile; } public void setProfile(Profile profile) { this.profile = profile; } }
//Profile.java
package com.zyp.examples; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToOne; import javax.persistence.PrimaryKeyJoinColumn; import javax.persistence.Table; import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; /** * Profile entity. @author MyEclipse Persistence Tools */ @Entity @Table(name="profile") public class Profile implements java.io.Serializable { // Fields private static final long serialVersionUID = -6436265401783499807L; @Id @Column(name="pid") @GenericGenerator(name="foreignKey", strategy="foreign", parameters=@Parameter(name="property", value="user")) @GeneratedValue(generator="foreignKey", strategy=GenerationType.IDENTITY) private Integer pid; @Column(name="email") private String email; @Column(name="address") private String address; @OneToOne(targetEntity=User.class, cascade={CascadeType.ALL}, mappedBy="profile") @PrimaryKeyJoinColumn(name="id", referencedColumnName="id") private User user; // Constructors /** default constructor */ public Profile() { } /** full constructor */ public Profile(Integer pid, String email, String address) { this.pid = pid; this.email = email; this.address = address; } // Property accessors public Integer getPid() { return this.pid; } public void setPid(Integer pid) { this.pid = pid; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return this.address; } public void setAddress(String address) { this.address = address; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
//HibernateTest.java
package com.zyp.examples; import org.hibernate.Session; public class HibernateTest { public static void main(String[] args) { // addProfileByUser(); // addUserByProfile(); deleteFromUser(); } public static void deleteFromUser() { Session session = HibernateUtil.getSessionFactory().openSession(); session.getTransaction().begin(); session.delete(session.load(User.class, new Integer(1))); session.getTransaction().commit(); } public static void addProfileByUser() { Profile p = new Profile(); p.setAddress("yunnan"); p.setEmail("sdfds@1236.com"); User user = new User(); user.setName("zyp"); user.setPassword("123"); //注意这里是双向关系 user.setProfile(p); p.setUser(user); Session session = HibernateUtil.getSessionFactory().openSession(); session.getTransaction().begin(); session.save(user); session.getTransaction().commit(); } public static void addUserByProfile() { Profile p = new Profile(); p.setAddress("yunnan"); p.setEmail("sdfds@1236.com"); User user = new User(); user.setName("zyp"); user.setPassword("123"); //注意这里是双向关系 user.setProfile(p); p.setUser(user); Session session = HibernateUtil.getSessionFactory().openSession(); session.getTransaction().begin(); //保存profile session.save(p); session.getTransaction().commit(); } }
写这个文章的时候遇到了不少的麻烦,也差了一些资料,下面把一些错误罗列出来,希望大家把参考的URL好好看一下消化下,老实说,Annotation里面的参数还是挺麻烦的,有的时候只能凭感觉和经验。
参考文章
JPA Annotation常用指南
http://blog.sina.com.cn/s/blog_3da1cce1010009dj.html
经典错误:attempted to assign id from null one-to-one
http://hi.baidu.com/88feiquan/item/856bf3dec2b23e15e0f46fe0
Hibernate Mapping One-to-One using Annotations Tutorial
http://www.dzone.com/tutorials/java/hibernate/hibernate-example/hibernate-mapping-one-to-one-using-annotations-1.html
http://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship
- Hibernate_annotation_1to1_shareKey.rar (5.7 MB)
- 下载次数: 48
发表评论
-
Hibernate非空属性保存异常
2013-05-21 13:24 1249错误描述: Caused by: org.hi ... -
Hibernate读取错误
2013-05-21 13:22 805错误如下: Caused by: com.da ... -
【转】The user must supply a JDBC connection
2012-08-27 01:12 3361The user must supply a JDBC con ... -
Hibernate Annotation小记
2012-08-22 23:43 907老实说,Hibernate Annotation用起来 ... -
Hibernate Annotation 基于外键的一对多双向关联
2012-08-22 23:44 4187纠结了好久呀,因为没有set,关联关系没有保存对,导致插入数据 ... -
【转】Hibernate中的"Repeated column in mapping for entity"异常
2012-08-21 10:31 982文章来源:http://www.iteye.com/t ... -
Hibernate Annotation 唯一外键一对一双向关联
2012-08-20 22:38 1087继续上面的东西,修改下数据库脚本,把共享主键中的Pro ... -
【转】attempted to assign id from null one-to-one
2012-08-20 21:59 842one-to-one在hibernate中可以用来作为两张 ... -
Hibernate Annotation 基于连接表的单向一对多关联
2012-08-17 00:29 2265趁着今晚把一对多一起搞了吧,呵呵。。 一对多的关 ... -
Hibernate的一对多关联方式
2012-08-17 00:29 853之前阅读Hibernate reference的时候看 ... -
Hibernate Annotation 基于外键的单向一对多关联
2012-08-17 00:30 1549基于外键关联的单向一对多关联是一种很少见的情况,并不推荐使用。 ... -
Hibernate Annotation 基于外键的单向多对一关联
2012-08-16 01:26 2921其实一对多和多对一是一样的,只是看问题的角度不同。 ... -
Hibernate Annotation入门
2012-08-15 19:40 1611废话不多说,直接上例子(附件) 数据库脚本: ... -
Hibernate 1+N问题的原理与解决
2012-08-13 20:46 1251什么时候会遇到1+N ... -
【转】Hibernate获取记录总数
2012-08-13 20:41 1148hql获取记录条数 Str ... -
Hibernate基于连接表的一对多单向关联
2012-08-09 23:13 1463基于连接表,顾名思义就是需要建立中间表来保存两个表的关联关系。 ... -
Hibernate基于外键的一对多单向关联
2012-08-09 21:42 2019一对多,一个分类Category下有多个Product,从Ca ... -
Hibernate使用注解
2012-08-04 01:37 1073//类标志 @Entity @Table(name = & ...
相关推荐
在Java的持久化框架Hibernate中,`@OneToOne`注解用于表示一对一的关联关系,而唯一外键一对一双向关联则是这种关系的一种具体实现方式。这篇文章将深入探讨这一概念,帮助你理解如何在实际开发中应用。 首先,我们...
本文将深入探讨如何使用Hibernate注解实现基于外键的一对多双向关联。我们将通过具体实例来解析这个主题,并结合源码分析其工作原理。 首先,我们要明白一对多关联意味着一个实体可以拥有多个关联的实体。在数据库...
这里面包涵了需要用Hibernate Annotation时,所需要的所有jar包! 现在我们公司在做web项目的时候,已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用...
Hibernate 3是Hibernate ORM框架的一个重要版本,它引入了许多新特性,如对JPA(Java Persistence API)的支持,以及对注解的广泛使用。这一版本的更新使得Hibernate更加易于使用,同时也提高了代码的可读性和可维护...
- `@OneToOne`, `@OneToMany`, `@ManyToOne`, `@ManyToMany`: 用于处理各种关联关系,如一对一、一对多、多对一、多对多。 3. **继承与多态** - `@Inheritance`: 定义继承策略,如SINGLE_TABLE(单表)、JOINED...
hibernate annotation中文文档
在Hibernate中,注解(Annotation)是一种声明式的方法,用于配置实体类、属性以及它们与数据库表之间的映射关系。本文将深入探讨“最全的Hibernate Annotation API文档”中的关键知识点。 一、实体类(Entity) 在...
在这个例子中,`User`类代表了`users`表,`id`是主键,`username`是表的一个列,`role`是与`Role`类的一对多关联。 **4. 注解的优势** - **简洁性**:注解使得ORM配置与实体类代码紧密集成,减少了XML配置文件的...
Hibernate Annotation库是Java开发中用于简化对象关系映射(ORM)的一个重要组件,它使得开发者能够在Java类上直接使用注解来定义数据库映射,从而避免了传统的XML配置文件。这三个特定的jar包是Hibernate ORM框架中...
而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上添加注解来简化数据库表和实体类之间的映射配置。这篇博文将带你了解如何使用Hibernate Annotation进行开发。 首先,我们需要理解Java...
而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML配置文件的繁琐工作,使得开发过程更加简洁高效。本文将通过一个实际操作的实例,逐步介绍Hibernate Annotation的基础...
在多对多关联中很多值是自动生成,党双向多对多关联中没有定义任何物理映射时,Hibernate根据以下规则生成相应的值,关联表名:主表表名+下划线+从表表名,关联到主表的外键名:主表名+下划线+主表中的主键列名,...
总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...
本篇将详细讲解如何使用Hibernate进行一对一单向外键关联,并且该关联涉及到联合主键的注解配置。 首先,一对一关联可以分为两种类型:单向和双向。在单向一对一关联中,只有一个实体知道另一个实体的存在,而另一...
Hibernate Annotation
- `@OneToMany`, `@ManyToOne`, `@OneToOne`, `@ManyToMany`: 定义不同类型的关联关系,如一对一、一对多、多对一和多对多。 3. **实体类的注解示例** 一个简单的User实体类可能如下所示: ```java @Entity @...
hibernate 注解 annotation 教程
本文是讲解的是hibernate3.2的主键生成方式,通过annotation来实现,详细的分析了主键在hibernate的生成以及在真实项目的运用。。。。