- 浏览: 493606 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (211)
- Flex (4)
- Java (22)
- Servlet (4)
- 学习心得 (2)
- 生活琐事 (3)
- PHP (0)
- JavaScript (4)
- Linux (3)
- MYSQL (0)
- SQL SERVER (2)
- ORACLE (5)
- 项目技术积累 (0)
- 设计模式 (0)
- Photoshop (0)
- 网页制作 (8)
- 值得记住 (3)
- Struts1.x (7)
- Hibernate (31)
- IDE (10)
- Spring (5)
- EXT (0)
- Junit (4)
- dom4j (2)
- Log4j (3)
- Java标注 (1)
- WebService (1)
- JSON (2)
- Struts2,x (19)
- Ajax (6)
- 英文 (1)
最新评论
-
aduo_vip:
支持博主,好文!正好需要了
java怎样读写和修改XML文件?? -
默默pig:
楼主,您好。有个语法想问一下:引用你原文中“<resul ...
Struts2中redirect基本的经验之谈 -
Andrew0721:
road_16 写道楼主你好,你说到
redirect:act ...
Struts2中redirect基本的经验之谈 -
zhengkunsheng:
Struts2中redirect基本的经验之谈 -
road_16:
楼主你好,你说到
redirect:action处理完后重定向 ...
Struts2中redirect基本的经验之谈
1. 写在类定义上
@Entity // 表明是实体类
@Table(name="person_db") // 映射到的表名
2. 主键修饰
@Id @GeneratedValue(strategy = GenerationType.AUTO)-----表中 auto_increment
@Column(name = "id") // 数据库id
表示是主键,并且对应增长形势,对应表列
1) IDENTITY:表自增键字段,Oracle不支持这种方式;
2) AUTO: JPA自动选择合适的策略,是默认选项; ===auto_increment
3. SEQUENCE:通过序列产生主键,通过@SequenceGenerator注解指定序列名,MySql不支持这种方式;
4. TABLE:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
1) 普通属性
@Column(name = "name") // 名字
直接在某一属性上写,表示此属性对应表的列
2) 关系属性
@OneToMany(cascade = CascadeType.ALL, mappedBy = "person", fetch = FetchType.EAGER)
mappedBy="school"就相当于inverse=true,(mappedBy指定的是不需要维护关系的一端)
关系属性上,表示是OneToMany
cascade级联关系 mappedBy对应类中的自己的应用属性名 fetch懒加载(eager lazy)
@ManyToOne (optional=true, fetch = FetchType.EAGER)
@JoinColumn(name="person_id", nullable=true, insertable = false, updatable = false)
关系属性上,表示是ManyToOne
name表示对应表内字段
注:必须是所谓的双向关系,不然报 没有序列化异常
5. mysql的序列生成
auto_increment 自动增长
uuid()函数 适用于并发,但是效率不高,且占磁盘。(UUID的内容是字符串的)
6. @Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid") -----表中id没有主键生成
7. 特殊@Formula("select COUNT(*) from school_info")
private int count;
8. 关系修饰
@OneToOne注释指明Person 与IDCard为一对一关系,@OneToOne注释五个属性:targetEntity、cascade、fetch、optional 和mappedBy
*optional = true设置idcard属性可以为null。
*targetEntity属性:Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
*cascade属性:CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,
*而且这种关系是递归调用的。cascade的值只能从CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、
*CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。
*fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。
*FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。默认值是FetchType.LAZY。
*@OrderBy(value = "id ASC")注释指明加载元组时按id的升序排序(降序 "DESC")
@JoinColumn(name = "Person_ID", referencedColumnName ="personid",unique = true)指明IDCard对应表的Person_ID列作为外键与Person对应表的personid列进行关联.
9. @OneToOne的四个属性
1). targetEntity
targetEntity 属性是 Class 类型的属性。定义实体一对一关系中处于从属地位的实体类的类型。
2). mappedBy
mappedBy 属性是 String 类型的属性。mappedBy 属性的值是当前实体在关联实体中的属性名称,使用 mappedBy 可以定义实体类之间的双向关系。如果类之间是单向关系,不需要提供定义,如果类和类之间形成双向关系,我们就需要使用这个属性进行定义,否则可能引起数据一致性的问题。
3). cascade
cascade 属性的类型是 CascadeType[] 类型。cascade 属性定义实体和实体之间的级联关系。使用 cascade 属性定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同的操作,而且这种关系是递归调用的。
cascade 的值只能从 CascadeType.PERSIST(级联新建)、CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更新)中选择一个或多个。还有一个更方便的选择是使用 CascadeType.ALL,表示选择上面全部四项。
4) .fetch
fetch 属性是 FetchType 类型的属性。可选择项包括:FetchType.EAGER 和 FetchType.LAZY.前者表示关联关系的从类在主类加载的时候同时加载,后者表示关联关系的从类在自己被访问时才加载。默认值是 FetchType.EAGER.
5). optional
optional 属性是 boolean 类型的属性。optional 属性用于定义关联关系的从类对象是否必须存在。如果设置为 false,那么该属性就不能设置为 null.默认值是 true。注释的 optional 属性设为 True 表示该对象可以不存在。
例:
package com.persia.jpa; import java.io.Serializable; 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.Table; @Entity @Table(name="person") public class Person implements Serializable { private Integer id; private String name; private Short age; private Address address; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="personname",nullable=false,length=32) public String getName() { return name; } public void setName(String name) { this.name = name; } public Short getAge() { return age; } public void setAge(Short age) { this.age = age; } @OneToOne(optional=true,cascade=CascadeType.ALL,mappedBy="person") public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } }
1. javax.persistence.JoinColumn 注释可以和 javax.persistence.OneToOne 注释一起使用,用于定义关联关系中的主类在数据库中对应的表
通过什么字段和关联关系中的从类的主键进行关联,这个注释是可选的,如果不提供该注释,OpenJPA 会默认使用“对象名_ID”和关联表的主键字段进行关联。
2.JoinColumn 注释支持两个重要属性:name 和 referencedColumnName 属性。
(1)name
name 属性的类型是 String 类型。name 属性用于指定关联关系中的主类对应的表中和关联关系中的从类的主键进行关联的字段的名称。
(2)referencedColumnName
referencedColumnName 属性的类型是 String 类型。referencedColumnName 属性指定关联关系中的从类与关联关系中的主类对应的表之间形成关联关系的字段名称,通常用于关联关系中的从类的关联字段不是自己的主键的情况。
package com.persia.jpa; import java.io.Serializable; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Entity @Table(name="address") public class Address implements Serializable { private Integer id; private String city; private String street; private Person person; @Id @GeneratedValue(strategy=GenerationType.AUTO) public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getStreet() { return street; } public void setStreet(String street) { this.street = street; } @OneToOne(optional=false,cascade=CascadeType.ALL) @JoinColumn(name="person_id",referencedColumnName="id",unique=true) public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } }
使用 JoinColumn 注释设置两个对象对应数据库表之间的关联字段
name 属性指定关联关系中主类对应表中参与关联关系的字段名称,
referencedColumnNam 属性指定关联关系中从类对应表中参与关联关系的字段名称。
实体操作:
package com.persia.jpa; import javax.ejb.Remote; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless @Remote({OneToOneDAO.class}) public class OneToOneDAOBean implements OneToOneDAO { @PersistenceContext private EntityManager em; @Override public void deleteAddress(Integer id) { // TODO Auto-generated method stub Address a=em.find(Address.class, id); em.remove(a); } @Override public void deletePerson(Integer id) { // TODO Auto-generated method stub Person p=em.find(Person.class,id); em.remove(p); } @Override public Person getPersonByID(Integer id) { // TODO Auto-generated method stub Person p=em.find(Person.class,id); return p; } @Override public void insertPerson(String name, short age, String city, String street) { // TODO Auto-generated method stub Person p=new Person(); p.setName(name); p.setAge(age); Address address=new Address(); address.setCity(city); address.setStreet(street); address.setPerson(p); p.setAddress(address); em.persist(p); } @Override public void updatePersonInfo(Integer id, String newname, String newstreet) { // TODO Auto-generated method stub Person p=em.find(Person.class,id); p.setName(newname); Address a=p.getAddress(); a.setStreet(newstreet); } }
客户端:
package com.persia.jpa.test; import java.util.Properties; import javax.naming.InitialContext; import javax.naming.NamingException; import com.persia.jpa.oto.OneToOneDAO; import com.persia.jpa.oto.Person; public class Test { /** * @param args * @throws NamingException */ public static void main(String[] args) throws NamingException { Properties props=new Properties(); props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); props.setProperty("java.naming.provider.url","localhost:1099"); props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming"); InitialContext context=new InitialContext(props); try{ OneToOneDAO dao=(OneToOneDAO)context.lookup("OneToOneDAOBean/remote"); // dao.insertPerson("persia",new Short((short)26), "beijing", "shangdi"); //dao.insertPerson("linda", new Short((short)26), "beijing", "shangdi"); // dao.deletePerson(new Integer(8)); Person p=dao.getPersonByID(new Integer(5)); System.out.println(p.getName()+"-"+p.getAddress().getStreet()); dao.updatePersonInfo(new Integer(5), "persiacai", "fujian"); dao.deleteAddress(new Integer(10)); }catch(Exception e){ e.printStackTrace(); } } }
发表评论
-
Hibernate Annotations
2009-10-14 09:27 1360Hibernate Annotations為Hibernate ... -
Hibernate中Criteria的完整用法
2009-10-13 13:04 931使用 Spring 和 Hibernate 进行开发,有感于C ... -
Hibernate3的DetachedCriteria支持
2009-10-13 10:37 915Hibernate3支持DetachedCriteria,这是 ... -
Hibernate删除操作
2009-09-25 12:35 13583import org.hibernate.Query; ... -
Hibernate session 方法总结
2009-09-23 10:26 1730Session.get / load的区别: ... -
关于hibernate字段初始值的配置问题
2009-09-23 10:01 1611在使用Hibernate配置文件生成表结构时,可以为表中的某个 ... -
Hibernate 配置文件precision与scale的说法
2009-09-23 09:38 1788Oracle使用标准、可变长度的内部格式来存储数字。这个内部格 ... -
SSH中文乱码
2009-07-23 15:52 2710㈠页面显示中文乱码 ㈡传递参数中文乱码 ㈢国际化资源文件乱码 ... -
Hibernate中多对多的关联关系
2009-07-22 15:11 987在Hibernate中,碰到多对多的关联关系时,一般将其 ... -
Hibernate中一对一的关联关系2
2009-07-22 14:45 904在上次的一对一中,采用的card表中的id是从person表中 ... -
Hibernate一对一的关联关系
2009-07-22 14:11 1061一对一关联关系此处通过一个人对应一个身份证,此处身份证类 ... -
Hibernate中一对多的关联关系
2009-07-22 13:29 1045还是参照员工与部门的例子,从员工角度看,员工与部门是多对一的关 ... -
多对一关联关系的检索
2009-07-22 11:41 993还是以员工与部门的关系,在多对一的关联关系下,如果查询部 ... -
关联关系 -- 多对一
2009-07-22 11:09 1041多对一 (员工-部门): 多个员工所于同一个部门 ... -
Hibernate的关联关系
2009-07-22 10:39 1037Hibernate中的主要关联关系: . 多对一 ... -
Criteria查询方式
2009-07-21 15:33 1042Criteria 查询更像是一种面向对象的查询方式,其没 ... -
HQL接口分页查询
2009-07-21 15:23 2114如下Query提供的方法可以实现分页: 1. ... -
HQL的命名参数
2009-07-21 15:02 2127如下: ...... String hql ... -
Hibernate中实体类或者属性名与数据库关键字发生冲突
2009-07-21 14:54 2048在Hibernate中有一个类名为user, ... -
Query接口的uniqueResult()方法
2009-07-21 14:44 7631以前写代码,总免不了编写登陆部分。在获取user的时候,只可能 ...
相关推荐
2. **映射机制**: Hibernate支持XML映射文件(hbm.xml)和注解映射两种方式,让对象与数据库表之间建立映射关系。 3. **Session和Transaction**: Session是Hibernate的主要工作单元,负责保存、更新和检索对象。...
已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm....
Hibernate Annotation与XML的混合使用** 在某些场景下,可能需要结合XML和注解来实现更复杂的映射。Hibernate支持同时使用两种方式,以应对XML配置无法满足的需求。 **6. 总结** Hibernate Annotation简化了ORM的...
尽管无需惊天的修改,但这一工作与使用 HibernateAnnotations 有所不同。您需要使用 AnnotationConfiguration 类来建立会话工厂:sessionFactory = new AnnotationConfiguration().buildSessionFactory(); 3.尽管...
都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式
### Hibernate Annotation 中文文档知识点概览 #### 一、创建注解项目 ##### 1.1 系统需求 在创建一个使用 Hibernate 注解的项目之前,需要满足一定的系统环境需求,例如支持 Java 的开发环境、JDK 版本、支持 ...
5. XML与注解的对比:在Hibernate 3.3之前,配置通常通过XML文件完成,例如`hibernate.cfg.xml`和`hbm.xml`。虽然XML提供了灵活性和详细控制,但增加了大量的额外文件和代码。使用注解后,大部分配置可以直接写在...
**Hibernate Annotation 入门** Hibernate 是一款非常流行的Java对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。而Hibernate Annotation是Hibernate的一个重要特性,它通过在Java类和字段上...
《Hibernate Annotation 学习笔记》 在Java的持久化框架中,Hibernate以其强大的功能和易用性成为开发者首选之一。而Hibernate Annotation则是Hibernate提供的一种基于注解的实体映射方式,它极大地简化了传统XML...
myeclipse的自带hibernate jar包不支持注解;自己找的hibernate注解所需的jar包:hibernate-core;hibernate-annotation;hbm-cfg-xml;log4j.properties
4. 编写映射文件:创建User.hbm.xml和Order.hbm.xml,定义实体类的字段和关联关系。 5. SessionFactory创建:使用`Configuration`对象加载配置文件并构建SessionFactory。 6. 数据操作:通过SessionFactory的...
【描述】中提到的“Hibernate-Annotation”是指Hibernate框架中的一种元数据声明方式,它允许开发者通过在Java类和字段上直接使用注解(Annotation)来替代传统的XML配置文件(如*.hbm.xml)。这种做法显著提高了...
通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成
#### 二、Hibernate_Annotation核心概念与使用 ##### 2.1 注解基础 - **@Entity**:表示类是一个实体类,用于持久化数据。 - **@Table**:指定实体类所对应的数据库表名。 - **@Id**:标记主键字段。 - **@...
1. **注解替代XML映射**:在Hibernate 3.2及更高版本中,引入了Annotation支持,开发者可以直接在Java实体类上使用注解来定义持久化字段和关系,不再需要创建单独的`.hbm.xml`映射文件。 2. **依赖**:使用...
### Hibernate Annotation概述与实践 #### 一、Hibernate Annotation简介 Hibernate作为Java领域内最流行的ORM框架之一,在过去的几年中经历了显著的发展,已经成为Java数据库持久化的事实标准。它不仅功能强大,...
2. **映射**:在Hibernate中,映射是指将Java对象与数据库表之间的关系进行定义,这涉及到XML配置文件或注解(Annotation)的方式,如`hbm.xml`和`@Entity`。 3. **主键自增**:Hibernate提供了多种主键生成策略,...
1. @Entity:用于标记一个类作为Hibernate管理的实体类,相当于XML中的<hbm:entity>标签。 2. @Table:定义实体类所对应的数据库表名,可以设置schema和catalog属性来指定库和表的命名空间。 3. @Column:用于指定...