一对多的查询和删除

查询

直接查询即可 普通方式

删除

第一种:删除外键后 删除

Session session = HibernateUtils.openSession();
session.getTransaction().begin();
//查询一个用户
Customer customer= (Customer)session.get(Customer.class, 1);

//因为数据库中有外键约束 所以不能使用session.delete方法直接删除
//可以将订单类中的外键设置为空之后删除
for(Order order:customer.getOrders()){
    order.setCustomer(null);
}
session.delete(customer);
session.getTransaction().commit();
session.close();

第二种方式 设置级联方式(cascade)

save-update:级联保存,级联修改
将顾客和订单绑定之后 只需保存顾客 订单也会相应保存 修改也会同步修改

<set name="orders" inverse="true" cascade="save-update">
<!--            填写Order表中的外键-->
    <key column="customer_id" ></key>
    <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
</set>

delete:级联删除 直接删除顾客 对应的订单也会被删除

<set name="orders" inverse="true" cascade="delete">
<!--            填写Order表中的外键-->
    <key column="customer_id" ></key>
    <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
</set>

delete-orphan:孤儿删除 接触顾客和订单的关系 将订单删除 保存顾客

<set name="orders" inverse="true" cascade="delete-orphan,save-update">
<!--            填写Order表中的外键-->
   <key column="customer_id" ></key>
   <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
</set>
  Session session = HibernateUtils.openSession();
        session.getTransaction().begin();
        //查询一个用户
        Customer customer= (Customer)session.get(Customer.class, 1);
        //获取顾客订单
        Set<Order> orders = customer.getOrders();
        //获取迭代器
        Iterator<Order> it=orders.iterator();
        while(it.hasNext()){
            it.next();
            it.remove();//移除订单 维护关系
        }
        session.getTransaction().commit();
        session.close();

注:级联组合
1,可以使用逗号隔开

<set name="orders" inverse="true" cascade="delete-orphan,save-update,delete">
<!--            填写Order表中的外键-->
     <key column="customer_id" ></key>
     <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
 </set>

2, all: save-update 和 delete 整合 all-delete-orphan:delete-orphan,save-update,delete整合

<set name="orders" inverse="true" cascade="all">
<!--            填写Order表中的外键-->
     <key column="customer_id" ></key>
     <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
 </set>

<set name="orders" inverse="true" cascade="all-delete-orphan">
<!--            填写Order表中的外键-->
     <key column="customer_id" ></key>
     <one-to-many class="org.ccit.com.domain.Order"></one-to-many>
 </set>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java中的一对多查询通常是指一个实体类对应多个相关联的实体类。例如,一个订单(Order)可以对应多个订单详情(OrderDetail)。 实现一对多查询的方式有很多种,其中比较常见的方式是使用JPA(Java Persistence API)或Hibernate框架。下面以JPA为例,介绍一下如何实现一对多查询。 首先,我们需要定义两个实体类:Order和OrderDetail。Order类包含多个OrderDetail对象,因此在Order类中使用@OneToMany注解来定义关联关系: ``` @Entity public class Order { @Id private Long id; private String orderNo; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL, orphanRemoval = true) private List<OrderDetail> orderDetails; // getter和setter方法省略 } ``` 上面的代码中,@OneToMany注解表示一个订单可以包含多个订单详情,mappedBy属性指定了关联关系维护的是OrderDetail类中的order属性,cascade属性表示级联操作,orphanRemoval属性表示在删除订单时是否删除其对应的订单详情。 接下来,我们需要定义OrderDetail类,并在该类中使用@ManyToOne注解来定义与Order类的关联关系: ``` @Entity public class OrderDetail { @Id private Long id; private String productName; private BigDecimal price; @ManyToOne @JoinColumn(name = "order_id") private Order order; // getter和setter方法省略 } ``` 上面的代码中,@ManyToOne注解表示每个订单详情都属于一个订单,@JoinColumn注解指定了关联的外键列名为order_id。 最后,我们可以使用JPA提供的查询方法来实现一对多查询。例如,下面的代码可以查询id为1的订单及其对应的所有订单详情: ``` @Repository public interface OrderRepository extends JpaRepository<Order, Long> { @Query("select o from Order o left join fetch o.orderDetails where o.id = :id") Optional<Order> findByIdWithDetails(@Param("id") Long id); } ``` 上面的代码中,@Query注解表示使用JPQL(Java Persistence Query Language)查询语句,left join fetch语句表示使用左外连接查询,同时抓取Order对象的所有OrderDetail对象,@Param注解表示传入参数id。 以上就是使用JPA实现一对多查询的方法。当然,除了JPA之外,还有其他方式可以实现一对多查询,例如使用Hibernate框架或者手写SQL语句等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值