hibernate的两种映射

Hibernate里的字段映射有2种方式,一是直接在Java文件里注解,我叫做注解定义;一是利用hbm.xml文件+普通的Bean文件映射,我叫做mapping定义。但是不管怎样,这2种方式不能一起使用,混合使用也不行!要么就用第1种方式,要么用第2种方式。当然,如果一个项目中有2个或多个需要映射,我们把其中的User表用直接在Java文件中映射,而另外的Product表用hbm.xml映射,这是可以的。

1.自增型主键:
     1.1 oracle9/10:Oracle9/10并没有自增长字段,所以定义和别的不太一样
         1.1.1注解定义:
@Entity
@Table(name = "USERS")
@javax.persistence.SequenceGenerator(name="SEQ_USER", sequenceName="SEQ_USERS")
public class UserByZhuJie {
     private Integer id;

     @Id
     @Column(updatable=false, insertable=false)
     //@GeneratedValue(strategy = GenerationType.AUTO)     //自增长ID
     @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="SEQ_USER")
     public Integer getId() {
         return id;
     }
                
         1.1.2mapping定义:
         <id name="id" column="ID" type="integer">
             <generator class="sequence">
                 <param name="sequence">SEQ_USERS</param>
             </generator>
          </id>
     1.2 MySQL、MS SQLSERVER为代表的,有自增长字段
         1.2.1注解定义:
     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Integer getId() {
         return id;
     }
         1.2.2mapping定义:
         <id name="id" column="ID" type="integer">
             <generator class="native"/>
          </id>
2.一般的字段类型(string,date,integer等等)
     2.1注解定义:
         不用注解;
     2.2mapping定义:
         <property name="name" column="NAME" type="string" not-null="true"/>
3.Clob字段类型:关于Clob字段类型,网上有很多种说法,我现在给出其中一种,是测试通过的,我往数据库里写入一个31K左右的数据成功执行。
     3.0在Java的Bean文件里,把Clob字段定义成String型的:
...
public class User {
...
     private String descn;
...
     public String getDescn() {
         return descn;
     }

     public void setDescn(String descn) {
         this.descn = descn;
     }
}
     3.1注解定义:
         不用注解;

     3.2mapping定义:
         <property name="descn" column="DESCN" type="text"/>
4.Date字段类型。
     4.0在Java的Bean文件里,把Date字段定义成Date型的:
...
import java.util.Date;

...
     private Date publishDate;
...
     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}

     4.1注解定义:
         不用注解;
     4.2mapping定义:
         <property name="publishDate" column="ATTR4" type="date"/>     //这里我们是把publichDate属性映射到表的ATTR4这个字段上了



5.继承关系映射,以bookstore例中的Book-Product为例,Book实例从Product继承而来,但是2者共用1张数据表(product表):
     5.1注解定义:
         5.1.1Product.java源文件,这个源文件可以在bookstore例子中找到:
package org.springside.bookstoredemo.model;

import javax.persistence.*;

import org.apache.commons.lang.StringUtils;
import org.compass.annotations.SearchableComponent;
import org.compass.annotations.SearchableId;
import org.compass.annotations.SearchableProperty;
import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.springside.core.dao.extend.UndeleteableEntityOperation;

/**
* 产品.带jpa与hibernate扩展的annotation 及compass annotation.
*
* @author cac
* @author schweigen
*/

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("product")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Product {
     private static final int SHORT_DESCN_LENGTH = 200;

     @SearchableId
     private Integer id;

     @SearchableComponent
     private Category category;

     private Integer inventory;

     @SearchableProperty
     private String name;

     private String descn;

     private Double unitprice=0.0;

     private String status = UndeleteableEntityOperation.NORMAL_VALUE;

     private String shortDescn = null;

      @ManyToOne
     @JoinColumn(name = "CATEGORY_ID")
     public Category getCategory() {
         return this.category;
     }
     public String getDescn() {
         return this.descn;
     }

     @Id
     @GeneratedValue(strategy = GenerationType.AUTO)
     public Integer getId() {
         return id;
     }

     public Integer getInventory() {
         return this.inventory;
     }

     public String getName() {
         return this.name;
     }

     @Transient
     public String getShortDescn() {
         if (shortDescn == null) {
             shortDescn = StringUtils.substring(descn, 0, SHORT_DESCN_LENGTH) + "...";
         }
         return shortDescn;
     }

     public String getStatus() {
         return this.status;
     }

     public Double getUnitprice() {
         return this.unitprice;
     }

      public void setCategory(Category category) {
         this.category = category;
     }
    
   
     public void setDescn(String descn) {
         this.descn = descn;
     }

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

     public void setInventory(Integer inventory) {
         this.inventory = inventory;
     }

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

     public void setShortDescn(String shortDescn) {
         this.shortDescn = shortDescn;
     }

     public void setStatus(String status) {
         this.status = status;
     }

     public void setUnitprice(Double unitprice) {
         this.unitprice = unitprice;
     }
}
     5.1.2Book.java源文件,这个源文件在bookstore例中找到:
package org.springside.bookstoredemo.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

import org.compass.annotations.Searchable;
import org.compass.annotations.SearchableProperty;
import org.springside.core.dao.extend.Undeletable;

/**
* 图书.带jpa 与 compass的 annotation配置.
*
* @author cac
* @author schweigen
* @see Product
*/
@Entity
@DiscriminatorValue("book")
@Searchable(alias = "book")
@Undeletable
public class Book extends Product {

     @SearchableProperty
     private String author;

     private String image;

     @SearchableProperty
     private String publisher;

     private Date publishDate;

     @Column(name = "ATTR1")
     public String getAuthor() {
         return author;
     }

     public void setAuthor(String author) {
         this.author = author;
     }

     @Column(name = "ATTR2")
     public String getImage() {
         return image;
     }

     public void setImage(String image) {
         this.image = image;
     }

     @Column(name = "ATTR3")
     public String getPublisher() {
         return publisher;
     }

     public void setPublisher(String publisher) {
         this.publisher = publisher;
     }

     @Column(name = "ATTR4")
     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}
以上2个文件列出了Book是如何从Product继承过来的,主要分析class的定义部分,以及2个实例对属性定义有什么不同。

     5.2mapping定义:特别要说明的是,因为Book和Product的继承关系,我们在定义映射的时候要捆绑定义,也就是说要么2者都采用注解定义,要么2者都采用mapping方式定义
         5.2.1Product.java源文件:
package org.springside.bookstoredemo.model;


import org.apache.commons.lang.StringUtils;

public class Product {
     private static final int SHORT_DESCN_LENGTH = 200;

     private Integer id;

     private Category category;

     private Integer inventory;

     private String name;

     private String descn;
   
     private String type;

     private Double unitprice=0.0;

     private String status = "1";

     private String shortDescn = null;

     public Category getCategory() {
         return this.category;
     }
     public String getDescn() {
         return this.descn;
     }

     public Integer getId() {
         return id;
     }

     public Integer getInventory() {
         return this.inventory;
     }

     public String getName() {
         return this.name;
     }
     public String getShortDescn() {
         if (shortDescn == null) {
             shortDescn = StringUtils.substring(descn, 0, SHORT_DESCN_LENGTH) + "...";
         }
         return shortDescn;
     }

     public String getStatus() {
         return this.status;
     }

     public Double getUnitprice() {
         return this.unitprice;
     }

      public void setCategory(Category category) {
         this.category = category;
     }
    
      public void setDescn(String descn) {
         this.descn = descn;
     }

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

     public void setInventory(Integer inventory) {
         this.inventory = inventory;
     }

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

     public void setShortDescn(String shortDescn) {
         this.shortDescn = shortDescn;
     }

     public void setStatus(String status) {
         this.status = status;
     }

     public void setUnitprice(Double unitprice) {
         this.unitprice = unitprice;
     }
}
从Product.java源文件可以看出,在用hbm.xml和java文件一起定义映射的时候,java文件实际上是1个普通的Javabean,是没有任何注解的,所有的映射都是在Product.hbm.xml中完成。
         5.2.2Book.java源文件:
package org.springside.bookstoredemo.model;

import java.util.Date;


public class Book extends Product {

     private String author;

     private String image;

     private String publisher;

     private Date publishDate;

     public String getAuthor() {
         return author;
     }

     public void setAuthor(String author) {
         this.author = author;
     }

     public String getImage() {
         return image;
     }

     public void setImage(String image) {
         this.image = image;
     }

     public String getPublisher() {
         return publisher;
     }

     public void setPublisher(String publisher) {
         this.publisher = publisher;
     }

     public Date getPublishDate() {
         return publishDate;
     }

     public void setPublishDate(Date publishDate) {
         this.publishDate = publishDate;
     }
}
         5.2.3Product.hbm.xml源文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2007-6-22 15:06:10 by Hibernate Tools 3.2.0.b9 -->
<hibernate-mapping package="org.springside.bookstoredemo.model">
     <class name="Product" table="product" catalog="bookstore" discriminator-value="product">
         <id name="id" type="int">
             <column name="ID" />
             <generator class="native" />
         </id>

     <discriminator column="TYPE" type="string"/>
       
         <property name="name" type="string">
             <column name="NAME" length="80" not-null="true">
             </column>
         </property>
         <property name="descn" type="string">
             <column name="DESCN">
             </column>
         </property>
         <property name="unitprice" type="double">
             <column name="UNITPRICE" precision="10">
             </column>
         </property>
         <property name="inventory" type="java.lang.Integer">
             <column name="INVENTORY">
             </column>
         </property>
         <property name="status" type="string">
             <column name="STATUS">
             </column>
         </property>
         <many-to-one name="category" column="category_id" update="false"/>
     </class>
</hibernate-mapping>
其中<discriminator column="TYPE" type="string"/>这行语句定义了继承规则是列TYPE的值,如果是book,那么就是实体Book的一“行”,下面的 Book.hbm.xml通过<subclass name="Book" extends="Product" discriminator-value="book">表示的意义就是Book从Product继承过来,而且继承的数据是TYPE列的值为 'book'

         5.2.4Book.hbm.xml源文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2007-6-22 15:06:10 by Hibernate Tools 3.2.0.b9 -->
<hibernate-mapping package="org.springside.bookstoredemo.model">
     <subclass name="Book" extends="Product" discriminator-value="book">
         <property name="author" type="string">
             <column name="ATTR1">
                 <comment></comment>
             </column>
         </property>
         <property name="image" type="string">
             <column name="ATTR2">
                 <comment></comment>
             </column>
         </property>
         <property name="publisher" type="string">
             <column name="ATTR3">
                 <comment></comment>
             </column>
         </property>
         <property name="publishDate" type="date">
             <column name="ATTR4">
                 <comment></comment>
             </column>
         </property>
     </subclass>
</hibernate-mapping>
     5.3几条简单的Hibernate后台语句:
      [java] Hibernate: select count(*) as col_0_0_ from bookstore.product book0_
where book0_.type='book' and book0_.STATUS<>'-1'
      [java] Hibernate: select book0_.ID as ID0_, book0_.NAME as NAME0_, book0_.D
ESCN as DESCN0_, book0_.UNITPRICE as UNITPRICE0_, book0_.INVENTORY as INVENTORY0
_, book0_.STATUS as STATUS0_, book0_.category_id as category8_0_, book0_.ATTR1 a
s ATTR9_0_, book0_.ATTR2 as ATTR10_0_, book0_.ATTR3 as ATTR11_0_, book0_.ATTR4 a
s ATTR12_0_, from bookstore.product book0_
where book0_.type='book' and book0_.STATUS<>'-1' order by book0_.ID desc limit
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hibernate 的核心功能之一是 Java 对象和数据库表之间的映射,这是实现 ORM 的核心。Hibernate 提供了多种方式来进行对象和表之间的映射,包括 XML 映射文件、注解和 Java 代码映射等。无论使用哪种方式,Hibernate映射原理都是一致的。 Hibernate映射原理可以分为两个方面:对象属性和表列之间的映射、对象之间的关系映射。 1. 对象属性和表列之间的映射Hibernate 中,每个实体类都对应着一个数据库表,实体类的属性对应着数据库表的列。在使用 Hibernate 进行数据库操作时,Hibernate 会将实体对象的属性值映射到数据库表的列上,或将数据库表的列值映射到实体对象的属性上。Hibernate 的属性和表列之间的映射关系主要通过映射文件或注解来进行配置。 在映射文件中,使用 <class> 标签定义实体类,使用 <property> 标签或 <id> 标签来定义属性,使用 <column> 标签来定义属性对应的数据库表列。例如: ```xml <class name="com.example.User" table="user"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="age" column="age" type="integer"/> </class> ``` 在注解中,使用 @Entity 标注实体类,使用 @Column 标注属性对应的数据库表列。例如: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "age") private Integer age; // 省略 getter 和 setter 方法 } ``` 2. 对象之间的关系映射Hibernate 中,实体类之间可以存在多种关系,包括一对一、一对多、多对一和多对多等。Hibernate 通过映射文件或注解来定义实体类之间的关系映射关系。 例如,一对多关系可以通过在多的一方的实体类中定义一个集合属性来表示。在映射文件中,使用 <set> 标签定义集合属性,使用 <one-to-many> 标签定义集合元素对应的实体类。例如: ```xml <class name="com.example.Order" table="orders"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <set name="items" inverse="true" lazy="true" cascade="all"> <key column="order_id"/> <one-to-many class="com.example.OrderItem"/> </set> </class> <class name="com.example.OrderItem" table="order_items"> <id name="id" type="long" column="id"> <generator class="identity"/> </id> <property name="name" column="name" type="string"/> <property name="price" column="price" type="double"/> <many-to-one name="order" class="com.example.Order" column="order_id"/> </class> ``` 在注解中,可以使用 @OneToMany 和 @ManyToOne 注解来定义一对多关系,使用 @JoinColumn 注解来定义外键。例如: ```java @Entity @Table(name = "orders") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderItem> items; // 省略 getter 和 setter 方法 } @Entity @Table(name = "order_items") public class OrderItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; @Column(name = "price") private Double price; @ManyToOne @JoinColumn(name = "order_id") private Order order; // 省略 getter 和 setter 方法 } ``` 总之,Hibernate映射原理是将 Java 对象和数据库表之间的属性和关系进行映射,通过映射文件或注解来进行配置Hibernate 支持多种关系映射,包括一对一、一对多、多对一和多对多等,开发人员可以根据需要选择合适的映射方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值