Hibernate注解开发

本文详细介绍Hibernate中使用注解简化配置的方法,包括实体类注解、主键生成策略、一对多及多对一关联关系的配置,并探讨注解开发中常见问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值