1.在Hibernate中我们使用注解,可以帮助我们简化hbm的配置。
--PO类注解开发
@Entity//定一个实体
@Table(name="t_book",catalog="hibernettest")//描述类与表的对应关系
public class Book {
@Id//主键
@GeneratedValue(strategy=GenerationType.IDENTITY) //identity//声明一个主键生成策略。默认情况下相当于native。可以选择的主键生成策略AUTO IDENTITY SEQUENCE
private Integer id;
@Column(name="c_name",length=30,nullable=true)//定义列,注意对于PO类中的所有属性,如果你不写注解,默认情况下也会在表中生成对应的列,列的名称就是属性的名称。
private String name;
@Temporal(TemporalType.TIMESTAMP)//定义日期类型,可以选择TemporalType.DATA(只有年月日) TemporalType.TIME(只有时分秒) TemporalType.TIMESTAMP(年月日时分秒)
private Date publicationDate;
private Double price;//如果没有添加注解,也会自动的生成在表中。
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getPublicationDate() {
return publicationDate;
}
public void setPublicationDate(Date date) {
this.publicationDate = date;
}
}
--我们最终需要在hibernate.cfg.xml文件中将我们类中注解配置引用生效。
<mapping class="domain.Book" />
2.常见问题:
--1.如果我们的主键生成策略想使用UUID类型?
@Id
@GenericGenerator(name="myuuid",strategy="uuid")
@GeneratedValue(generator="myuuid")
private String id;
--2.如果设定类的属性不在表中映射
@Transient
private String msg;
3.注解开发一对多、多对一
Customer类:
@oneToMany(targetEntity=order.class,mappedBy="c")
private Set<order> orders= new HashSet<order>();
Order:
@ManyToOne(targetEntity=Customer.class)
@JoinColumn(name = "c_customer_id");
private Customer c;
example:保存客户时,保存订单。
对于这个示例我们需要子啊Customer中配置Cascade操作,save-update
第一种方式,可以使用JPA注解:
@OneToMany(targetEntity=Order.class,mappedBy="c",cascade=CascadeType.all)
private Set<order> orders= new hashSet<Order>();
第二种方式:我们可以使用Hibernate提供的注解
@OneToMany(targetEntity = Order.class,MappedBy="c")
@Cascade(CascadeType.SAVE_UPDATE)
private Set<Order> orders = new hashSet<Order>();
示例代码:
c.getOrders().add(O1);
c.getOrders().add(O2);
session.save(c);
--问题:订单中没有关联客户的id,为什么?
我们在Customer中配置了mappedBy=“c”,代表的是外键的维护由Order方来维护,而Customer不维护,这时你在保存客户时,级联保存订单是可以的,但是不能维护外键,所以,我们必须在代码中添加,订单与客户关系。
//建立联系
//为了维护外键
o1.setC(c);
o2.setC(c);
//原因为了进行级联操作
c.getOrders().add(o1);
c.getOrders().add(o2);
session.save(c);
--扩展:关于Hibernate注解@cascad中的DELTE_ORPHAN过时
@OneToMany(targetEnttity=Order.class,mappedBy="c")
@Cascade(CascadeType.DELETE_ORPHAN)
private Set<Order> orders = new HashSet<Order>();
使用下面方案来替换过时方案:
@OneToMany(targetEntity=Order.class,mappedBy="c",orphanRemoval = true)
private Set<Order> orders = new HashSet<Order>();