Hibernate实体基本注解,ManyToOne,OneToMany,cascade,orphanRemoval等说明

时间:2022-02-11 15:24:41

Hibernate注解实现实体持久化

首先我们创建一个实体类:


@Entity
@Table(name="product")
public class Product implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer pid;
@Column
private String pname;
@Column
private Double price;

@Entity:声明该类为一个实体类

@Table:对应数据库中的哪一张表,name=“数据库中的表名"

@Id:该字段为id属性

@GeneratedValue(strategy=GenerationType.IDENTITY):设置id在数据库中创建时自增自动生成

然后在Hibernate.cfg.xml中配置如下字段:

<mapping class="entity.Product"/>


如果我们是在Spring中的applicationContext.xml中配置的话,我们就在<bean id="sessionFactory"></bean>加上以下字段:

<property name="annotatedClasses">   
<list>
<value>entity.Product</value>
</list>
</property>

这样我们就完成了Hibernate实体注解的基本配置。


如果我们多个实体之间有一对多的关系,我们就需要使用@OneToMany,@ManyToOne:

案例:一个一级分类对应多个二级分类,一个二级分类对应多个商品对象。我们根据一级分类的id查询到它下面的所有商品集合。

@Entity
@Table(name="category")
public class Category implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer cid;
@Column
private String cname;
//一个一级分类对应多个二级分类
@OneToMany(targetEntity=Categorysecond.class,mappedBy="category",cascade=CascadeType.ALL,orphanRemoval=true,fetch=FetchType.EAGER)
@OrderBy("csid")//set集合中无序,所以我们通过csid排序
private Set<Categorysecond> categoryseconds=new HashSet<Categorysecond>();

@Entity
@Table(name="categorysecond")
public class Categorysecond implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer csid;
@Column
private String csname;
//多个二级分类对应一个一级分类
@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER,targetEntity=Category.class)
<span style="white-space:pre"></span>@JoinColumn(name = "cid")
private Category category;

//一个二级分类包含多个商品,这个表中不含有的列,所以不用使用JoinColumn
@OneToMany(targetEntity=Product.class,mappedBy="categorysecond",cascade=CascadeType.ALL,orphanRemoval=true,fetch=FetchType.EAGER)
@OrderBy("pid")//根据商品pid排序
private Set<Categorysecond> categoryseconds=new HashSet<Categorysecond>();

建立两个实体类,Categorysecond中含有外键cid,所以我们使用了@JoinColumn,这是因为一对多在多的一端加入外键,多对多就建立中间表.

targetEntity:对应的这个属性的那个类

mappedBy:把关系的维护交给多方对象的属性去维护关系

cascade:设置级联操作类型

orphanRemoval:如:一级分类删除,是否自动删除和该一级分类外键的二级分类及关联的商品对象,true代表自动删除

fetch:加载策略,如懒加载,因功能需要设置,如果我们需要查询一级分类的时候就把二级分类查出来,就不用懒加载。

@Entity
@Table(name="product")
public class Product implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer pid;
@Column
private String pname;
@Column
private Double market_price;
@Column
private Double shop_price;
@Column
private String image;
@Column
private String pdesc;
@Column
private Integer is_hot;
@Column
private Date pdate;
//fetch:加载策略,如懒加载
//多个商品对应一个二级分类
@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER,targetEntity=Categorysecond.class)
<span style="white-space:pre"></span> @JoinColumn(name = "csid")
private Categorysecond categorysecond;

商品类写好后,根据一级分类ID得到商品对象:

String hql="from Product p where p.categorysecond.category.cid=?"