- 浏览: 486338 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (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 1333Hibernate Annotations為Hibernate ... -
Hibernate中Criteria的完整用法
2009-10-13 13:04 902使用 Spring 和 Hibernate 进行开发,有感于C ... -
Hibernate3的DetachedCriteria支持
2009-10-13 10:37 887Hibernate3支持DetachedCriteria,这是 ... -
Hibernate删除操作
2009-09-25 12:35 13527import org.hibernate.Query; ... -
Hibernate session 方法总结
2009-09-23 10:26 1700Session.get / load的区别: ... -
关于hibernate字段初始值的配置问题
2009-09-23 10:01 1585在使用Hibernate配置文件生成表结构时,可以为表中的某个 ... -
Hibernate 配置文件precision与scale的说法
2009-09-23 09:38 1727Oracle使用标准、可变长度的内部格式来存储数字。这个内部格 ... -
SSH中文乱码
2009-07-23 15:52 2685㈠页面显示中文乱码 ㈡传递参数中文乱码 ㈢国际化资源文件乱码 ... -
Hibernate中多对多的关联关系
2009-07-22 15:11 963在Hibernate中,碰到多对多的关联关系时,一般将其 ... -
Hibernate中一对一的关联关系2
2009-07-22 14:45 883在上次的一对一中,采用的card表中的id是从person表中 ... -
Hibernate一对一的关联关系
2009-07-22 14:11 1034一对一关联关系此处通过一个人对应一个身份证,此处身份证类 ... -
Hibernate中一对多的关联关系
2009-07-22 13:29 1021还是参照员工与部门的例子,从员工角度看,员工与部门是多对一的关 ... -
多对一关联关系的检索
2009-07-22 11:41 972还是以员工与部门的关系,在多对一的关联关系下,如果查询部 ... -
关联关系 -- 多对一
2009-07-22 11:09 1017多对一 (员工-部门): 多个员工所于同一个部门 ... -
Hibernate的关联关系
2009-07-22 10:39 968Hibernate中的主要关联关系: . 多对一 ... -
Criteria查询方式
2009-07-21 15:33 1012Criteria 查询更像是一种面向对象的查询方式,其没 ... -
HQL接口分页查询
2009-07-21 15:23 2085如下Query提供的方法可以实现分页: 1. ... -
HQL的命名参数
2009-07-21 15:02 2041如下: ...... String hql ... -
Hibernate中实体类或者属性名与数据库关键字发生冲突
2009-07-21 14:54 1977在Hibernate中有一个类名为user, ... -
Query接口的uniqueResult()方法
2009-07-21 14:44 7600以前写代码,总免不了编写登陆部分。在获取user的时候,只可能 ...
相关推荐
已经不用*.hbm.xml这种映射文件了,都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm....
myeclipse的自带hibernate jar包不支持注解;自己找的hibernate注解所需的jar包:hibernate-core;hibernate-annotation;hbm-cfg-xml;log4j.properties
都是用Annotation(注解)方式来完成实体与表之间的映射关系,这样看起来比用xml文件来映射更具有可读性,自我感觉以后Hibernate Annotation的映射方式将代替hibernate 的*.hbm.xml映射方式
逐渐的Hibernate Annotation的映射方式也越来越盛行,相信过不了多久有可能会取代*.hbm.xml映射方式
即利用hibernate注解后,可不用定义持久化类对应的*.hbm.xml文件,直接以注解方式写入在持久化类中来实现。 Hibernate annotation使用了ejb JPA的注解,所以,下面安装配置hibernate annotation环境时,需要导入ejb的...
通过myeclipse自动生成Hibernate类文件和hbm.xml文件,链接数据库库自动生成
使用了annotation后可以自动不用写*.hbm.xml的配置文件。方便省事。
三、 Hibernate.cfg.xml:hbm2ddl.auto 16 四、 搭建日志环境并配置显示DDL语句 16 五、 搭建Junit环境 16 六、 ehibernate.cfg.xml : show_sql 17 七、 hibernate.cfg.xml :format_sql 17 八、 表名和类名不同,...
传统上,Hibernate的配置依赖于外部 *.hbm.xml文件:数据库映射被定义为一组 XML 映射文件,并且在启动时进行加载。 借助新的 Hibernate Annotation 库,即可一次性地分配所有旧映射文件——一切都会按照您的想法来...
3 hibernate annotation references 5 环境准备 5 1 下载hibernate-distribution-3.3.2.GA-dist 5 2 下载hibernate-annotations-3[1].4.0.GA 5 3 注意阅读hibernate compatibility matrix(hibernate 网站download) 5...
Hibernate Annotation简单应用 接着上次的程序我们将其改为Annotation版本的 既然用Annotation那就要将其对应的包导入到工程 然后我们将entity包中的Student.hbm.xml文件删除,将hibernate.cfg.xml文件中的 ...
解析:来源:Hibernate提供了Hibernate Annotations扩展包,它可以替换复杂的hbm.xml文件( Annotations扩展包是hibernate-annotation-3.4.0GA.zip) 作用:使得Hibernate程序的开发大大的简化。利用注解后,可不用...
spring+hibernate3.2+struts2.0 注解,超级简化,省略hbm.xml、bean注入xml配置等,一切annotation
-- 此处hibernate 的映射 采用的是.xml 配置同则应设置具体配置文件名(*.hbm.xml)</value>--> </list> </property> <!-- 事务配置管理 --> ...
<prop key="hibernate.hbm2ddl.auto">update <value>com.sixth.**.model <!-- 事务配置 --> class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <!-...
23. <prop key="hibernate.hbm2ddl.auto">${dataSource.hbm2ddl.auto}</prop> 24. <prop key="hibernate.hbm2ddl.auto">update</prop> 25. </props> 26. </property> 27. <property name="packagesToScan"> 28....
<property name="hibernate.hbm2ddl.auto">update <property name="hibernate.show_sql">true <mapping resource="cn/itcast/crm/domain/SysUserGroup.hbm.xml"/> * 测试.放置在junit包...
自己写的,eclipse插件,可以给指定目录下的pojo或者单个的pojo生成java annotation的xdoclet注释,然后maven可以调用并生成hbm文件