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

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=?"



  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值