posts - 3,  comments - 12,  trackbacks - 0
转自:http://blog.sina.com.cn/s/blog_4e17efaf0100eryx.html

任务分两天完成:(一人对多本书)
第一天:
  hbm:这种配置方法是以前用到的配置方法,比较熟悉。
  问题---mysql的序列生成的各种方法还待明天查
 
Annotation:第一次用到注释去写hibernate的映射,做了一下午
     由于jar包不齐,弄了很久
        --->核心jar包:ejb3-persistence.jar
        hibernate-annotations.jar
        hibernate-commons-annotations.jar
     hibernate.cfg.xml:
     加载映射时不是加载映射文件而是映射到实体类
     <mapping class="com.yeepay.entity.Person"/>
     工具类得到SessionFactory:
           seesionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
     标签: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:通过表产生主键,框架借由表模拟序列产生主键,使用该策略可以使应用更易于数据库移植
           3).普通属性
           @Column(name = "name") // 名字
           直接在某一属性上写,表示此属性对应表的列
           4).关系属性
           @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表示对应表内字段  
注:必须是所谓的双向关系,不然报 没有序列化异常
第二天:
    1.mysql的序列生成
          auto_increment 自动增长
          uuid()函数   适用于并发,但是效率不高,且占磁盘。(UUID的内容是字符串的)
    2.@Id  
      @GeneratedValue(generator = "system-uuid")  
      @GenericGenerator(name = "system-uuid", strategy = "uuid")    -----表中id没有主键生成
    3.特殊@Formula("select COUNT(*) from school_info")  
          private int count; 
    4.关系修饰
    @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列进行关联.
===================================================
以下是转帖
===================================================
@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 表示该对象可以不存在。

 1package com.persia.jpa;
 2
 3import java.io.Serializable;
 4
 5import javax.persistence.CascadeType;
 6import javax.persistence.Column;
 7import javax.persistence.Entity;
 8import javax.persistence.GeneratedValue;
 9import javax.persistence.GenerationType;
10import javax.persistence.Id;
11import javax.persistence.OneToOne;
12import javax.persistence.Table;
13
14@Entity
15@Table(name="person")
16public class Person implements Serializable {
17
18private Integer id;
19private String name;
20private Short age;
21private Address address;
22
23@Id
24@GeneratedValue(strategy=GenerationType.AUTO)
25public Integer getId() {
26return id;
27}

28public void setId(Integer id) {
29this.id = id;
30}

31
32@Column(name="personname",nullable=false,length=32)
33public String getName() {
34return name;
35}

36public void setName(String name) {
37this.name = name;
38}

39public Short getAge() {
40return age;
41}

42public void setAge(Short age) {
43this.age = age;
44}

45
46@OneToOne(optional=true,cascade=CascadeType.ALL,mappedBy="person")
47public Address getAddress() {
48return address;
49}

50public void setAddress(Address address) {
51this.address = address;
52}

53
54}

55


-------------------------------------------------------------------------------------------------------------------------
1.javax.persistence.JoinColumn 注释可以和 javax.persistence.OneToOne 注释一起使用,用于定义关联关系中的主类在数据库中对应的表

  通过什么字段和关联关系中的从类的主键进行关联,这个注释是可选的,如果不提供该注释,OpenJPA 会默认使用“对象名_ID”和关联表的主键

  字段进行关联。

2.JoinColumn 注释支持两个重要属性:name 和 referencedColumnName 属性。

(1)name

name 属性的类型是 String 类型。name 属性用于指定关联关系中的主类对应的表中和关联关系中的从类的主键进行关联的字段的名称。

(2)referencedColumnName

referencedColumnName 属性的类型是 String 类型。referencedColumnName 属性指定关联关系中的从类与关联关系中的主类对应的表

   之间形成关联关系的字段名称,通常用于关联关系中的从类的关联字段不是自己的主键的情况。

 1package com.persia.jpa;
 2
 3import java.io.Serializable;
 4
 5import javax.persistence.CascadeType;
 6import javax.persistence.Entity;
 7import javax.persistence.GeneratedValue;
 8import javax.persistence.GenerationType;
 9import javax.persistence.Id;
10import javax.persistence.JoinColumn;
11import javax.persistence.OneToOne;
12import javax.persistence.Table;
13
14@Entity
15@Table(name="address")
16public class Address implements Serializable {
17
18private Integer id;
19private String city;
20private String street;
21private Person person;
22
23@Id
24@GeneratedValue(strategy=GenerationType.AUTO)
25public Integer getId() {
26return id;
27}

28public void setId(Integer id) {
29this.id = id;
30}

31public String getCity() {
32return city;
33}

34public void setCity(String city) {
35this.city = city;
36}

37public String getStreet() {
38return street;
39}

40public void setStreet(String street) {
41this.street = street;
42}

43
44@OneToOne(optional=false,cascade=CascadeType.ALL)
45@JoinColumn(name="person_id",referencedColumnName="id",unique=true)
46public Person getPerson() {
47return person;
48}

49public void setPerson(Person person) {
50this.person = person;
51}

52}

使用 JoinColumn 注释设置两个对象对应数据库表之间的关联字段

name 属性指定关联关系中主类对应表中参与关联关系的字段名称,

referencedColumnNam 属性指定关联关系中从类对应表中参与关联关系的字段名称。



--------------------------------------------------------------------

实体操作:

 1package com.persia.jpa;
 2
 3import javax.ejb.Remote;
 4import javax.ejb.Stateless;
 5import javax.persistence.EntityManager;
 6import javax.persistence.PersistenceContext;
 7
 8@Stateless
 9@Remote({OneToOneDAO.class})
10public class OneToOneDAOBean implements OneToOneDAO {
11
12@PersistenceContext
13private EntityManager em;
14
15@Override
16public void deleteAddress(Integer id) {
17// TODO Auto-generated method stub
18       Address a=em.find(Address.class, id);
19       em.remove(a);
20}

21
22@Override
23public void deletePerson(Integer id) {
24// TODO Auto-generated method stub
25Person p=em.find(Person.class,id);
26     em.remove(p);
27}

28
29@Override
30public Person getPersonByID(Integer id) {
31// TODO Auto-generated method stub
32Person p=em.find(Person.class,id);
33return p;
34}

35
36@Override
37public void insertPerson(String name, short age, String city, String street) {
38// TODO Auto-generated method stub
39        Person p=new Person();
40        p.setName(name);
41        p.setAge(age);
42        Address address=new Address();
43        address.setCity(city);
44        address.setStreet(street);
45        address.setPerson(p);
46        p.setAddress(address);
47        em.persist(p);
48       
49}

50
51@Override
52public void updatePersonInfo(Integer id, String newname, String newstreet) {
53// TODO Auto-generated method stub
54        Person p=em.find(Person.class,id);
55        p.setName(newname);
56        Address a=p.getAddress();
57        a.setStreet(newstreet);
58  }

59
60}

61

疑问:在updatePersonInfo中不需要merge吗?

   如果是在客户端来setter设置的话,需要merge。



-------------------------------------------------------------------------------------------------------------------------------------

客户端:


 1package com.persia.jpa.test;
 2
 3import java.util.Properties;
 4
 5import javax.naming.InitialContext;
 6import javax.naming.NamingException;
 7
 8import com.persia.jpa.oto.OneToOneDAO;
 9import com.persia.jpa.oto.Person;
10
11
12public class Test {
13
14
15public static void main(String[] args) throws NamingException {
16Properties props=new Properties();
17      props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
18      props.setProperty("java.naming.provider.url","localhost:1099");
19      props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
20InitialContext context=new InitialContext(props);
21try{
22OneToOneDAO dao=(OneToOneDAO)context.lookup("OneToOneDAOBean/remote");
23// dao.insertPerson("persia",new Short((short)26), "beijing", "shangdi");
24//dao.insertPerson("linda", new Short((short)26), "beijing", "shangdi");
25// dao.deletePerson(new Integer(8));
26Person p=dao.getPersonByID(new Integer(5));
27System.out.println(p.getName()+"-"+p.getAddress().getStreet());
28dao.updatePersonInfo(new Integer(5), "persiacai""fujian");
29   dao.deleteAddress(new Integer(10));
30   }
catch(Exception e){
31e.printStackTrace();
32}

33
34}

35
36}

37

posted on 2010-06-04 22:39 [ 王志伟 ] 阅读(596) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 

<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(1)

随笔档案(3)

文章档案(29)

搜索

  •  

最新评论

阅读排行榜

评论排行榜