Hinernate JPA整理

来源:互联网 发布:sql server新建数据库 编辑:程序博客网 时间:2024/06/05 03:45

private Date birthday;//生日

在进行实体映射时,有关时间日期类型的类型可以是java.sql包下的java.sql.Datejava.sql.Time java.sql.Timestamp,还有java.util包下的java.util.Date java.util.Calendar类型。默认情况下,实体中使用的数据类型是java.sql包下的类,但此时如果要使用java.util包中的时间日期类型,则需要而外标注@Temporal注释来说明转化成java.util包中的类

@Temporal主要是用来指明java.util.Date  java.util.Calendar 类型的属性具体与数据库(date,time,timestamp)三个类型中的那一个进行映射   

     @Temporal(value = TemporalType.DATE)  

     public Date getBirthday() {  

         return birthday;  

     }  

   

     public void setBirthday(Date birthday) {  

         this.birthday = birthday;  

     }

java.sql.Datejava.sql.Timejava.sql.Timestamp这三种类型不同,它们表示时间的精确度不同。三者的区别如表所示。

表区别java.sql.Datejava.sql.Timejava.sql.Timestamp类型

类型
说明
java.sql.Date
日期型,精确到年月日,例如“2008-08-08”

java.sql.Time  
时间型,精确到时分秒,例如“20:00:00”

java.sql.Timestamp
时间戳,精确到纳秒,例如“2008-08-0820:00:00.000000001”

 

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

@OneToOne
l @OneToOne注释指明Person IDCard为一对一关系,@OneToOne注释五个属性:targetEntitycascadefetchoptional mappedBy
l optional =true设置idcard属性可以为null,也就是允讦没有身份证,未成年人就是没有身份证的。
l targetEntity属性:Class类型的属性。定义关系类的类型,默认是该成员属性对应的类类型,所以通常不需要提供定义。
l cascade属性:CascadeType[]类型。该属性定义类和类之间的级联关系。定义的级联关系将被容器视为对当前类对象及其关联类对象采取相同 的操作,而且这种关系是递归调用的。cascade的值只能从CascadeType.PERSIST(级联新建)、 CascadeType.REMOVE(级联删除)、CascadeType.REFRESH(级联刷新)、CascadeType.MERGE(级联更 新)中选择一个或多个。还有一个选择是使用CascadeType.ALL,表示选择全部四项。
l fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGERFetchType.LAZYFetchType.EAGER表示关系类(本例是OrderItem)在主类加载的时候同时加 载,FetchType.LAZY表示关系类在被访问时才加载。默认值是FetchType.LAZY
l @OrderBy(value= "id ASC")注释指明加载元组时按id的升序排序(降序"DESC"
Person.class
@OneToOne(optional = true, cascade = CascadeType.ALL, mappedBy ="person")
public IDCard getIdcard() {
return idcard;
}
public void setIdcard(IDCard idcard) {
this.idcard = idcard;
}

l @OneToOne注释指明IDCardPerson为一对一关系,IDCard是关系被维护端,
l optional =false设置person属性值不能为null,也就是身份证必须有对应的主人。
l@JoinColumn(name = "Person_ID", referencedColumnName="personid",unique = true)指明IDCard对应表的Person_ID列作为外键与Person对应表的personid列进行关联.
l unique= true 指明Person_ID 列的值不可重复。

@OneToMany里加入mappedBy属性避免生成中间表

使用JPA的时候,如果A B两个实体间是一对多,多对一的关系,如果不在@OneToMany里加入mappedBy属性(相当于inverse=”true”)会导致自动生成一个多余的中间表

 


IDCard.class


@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = "Person_ID", referencedColumnName ="personid", unique = true)
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}

 

 

mappedBy="customer"
说明在两个关联的实体Bean,orders这一端是关系的拥有者,Orders一方的表中生成到关联类的外键
mappedBy只有在双向关联时,才会使用这个属性
cascade=ALL
说明,OrdersCRUD操作时,Customer都会进行相应操作

In Customer class
 
@OneToMany(cascade=ALL, mappedBy="customer")
public  Set getOrders() { 
          return orders; 
}
 
 
In Order class
 
@ManyToOne
@JoinColumn(name="CUST_ID", nullable=false)
public Customer getCustomer() { 
          return customer; 
}
nullable=false:判断是否可空,为false则不可空
------------------------------------------------
@Embedded:当Address 类被定为@Embedded注释,

1.     @Embeddable  

2.     public class Address {  

3.     @Column(name = "ADDRESS_STREET", nullable = false)  

4.     private String street;  

5.     @Column(name = "ADDRESS_ZIPCODE", nullable = false)  

6.     private String zipcode;  

7.     @Column(name = "ADDRESS_CITY", nullable = false)  

8.     private String city;  

9.     }

那么在  User 类中

1.     @Entity  

2.     @Table(name = "USERS")  

3.     public class User {  

4.     ...  

5.     @Embedded  

6.     private Address homeAddress;  

7.     ...  

8.     }  

9.     用到了address类类型对象时 加了@Embedded 注释,那么user表中自动加入了address的几个字段

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

@Transient就是Hibernate持久化数据库时,用@Transient标记出某个字段,这个字段就不会参与对数据库表的操作,是一个辅助字段
@version:认为  并发的  概率很大    乐观所    hibernate  自己通过配置文件实现的       库中加了  一条   version字段    两个人同时查询  删改的时候  比库中的 版本号低的  不让修改
 

@MappedSuperclass@MappedSuperclass的用法,用在实体的继承过程中的父类,父类Cat, 子类1 BeijingCat, 2ShanghaiCat

结果生成 两张表t_beijingcatt_shanghaicat

如果不用@MappedSuperclass 而用@Entity替换的话,只会生成一张cat表,字段有:idnameshanghaicatbejingcat

 

 

@Inheritance: 对象使用引用以便关联到其它对象;关系型数据库表之间采用外键来描述表的关系。在关系型数据库中通常没有自然且有效的方法来描述类的继承关系。JPA通过Inheritance annotation提供了几种继承策略,它有以下属性:

@Inheritance:标识在父类上

http://whitesock.javaeye.com/blog/173543

  • InheritanceType strategy:用来声明继承策略。可选值是InheritanceType.SINGLE_TABLEInheritanceType.JOINEDInheritanceType .TABLE_PER_CLASS。缺省值是InheritanceType.SINGLE_TABLE

1.Single Table
    InheritanceType.SINGLE_TABLE
策略为类的继承体系采用同一个表。表名是基类的名称

2. Joined
    InheritanceType.JOINED
策略为类继承体系中的每个类创建不同的表。每个表只包含类中定义的列,因此在load一个子类的时候,JPA实现需要同时查询子类映射的表,以及通过关联查询所有的父类映射的表。PrimaryKeyJoinColumn annotation用来指定子类映射的表如何关联到父类映射的表。它有以下属性:

  • String name: 子类映射表中的列名。如果只有一个identity filed,那么缺省使用这个field对应的列名。
  • String referencedColumnName: 父类映射表中用来关联的列名。如果只有一个identity filed,那么缺省使用这个field对应的列名。
  • String columnDefinition: 数据库中列的数据类型。只有当JPA vendor支持通过metadata创建表的时候,这个属性才被使用

 

 

 

 

 

 

 

@PrimaryKeyJoinColumn

1.     @Entity  

2.     @PrimaryKeyJoinColumn(name="id", referencedColumnName="id")  

3.     public class Derived1 extends Base {  

4.         @Basic  

5.         private String derived1Name;  

6.     }


它的属性与@JoinColumn属性类似,说明如下。

l         name属性标识所在实体的表中关联字段的名称。

l         referencedColumnName属性标识为所关联的的表中字段名称。

原创粉丝点击