JPA简单对一对多关系的数据进行插入,先一后多

         JPA和HIBERNATE均属于ORM框架,两者在使用上也很相似,尤其是原理上。除了这两种操作DB的工具外,我们还可能使用到Serialization 、JDBC、ODB 、EJB2 、JDO等。

        此处仅简单通过JPA插入一对关系数据进行了解JPA的使用。对于一对多关系,从Object角度将,关系可能维护在多的一方,也可能维护在一的一方;从DBTable的角度将,则是多的一方维护着关系。而ORM工具为的是屏蔽对底层DB依赖,只需要学会使用JPA或HIBERNATE的API及相关知识就可以很方便的操作了。

        JPA是java规范,使用JPA离不开下面几个常用类。

          
javax.persistence.Persistence;
javax.persistence.EntityManagerFactory;
javax.persistence.EntityManager;
javax.persistence.Query;

         假设任务信息TItem和历史信息THist是一对多关系。假设一种场景需要存储多条任务信息,而且每种任务信息会携带多个相同的历史信息,此种情景可以简化理解为多次存储一对多关系(简单对比一下此种场景的如下说法:每种任务信息携带多个历史信息、每种任务信息携带多个不同的历史信息)。假设docIdList中携带任务信息相关内容,FormInfoList中携带历史信息相关内容。

       

//持久信息
EntityManagerFactory emf = Persistence.createEntityManagerFactory("your_unit");
		EntityManager emMy = emf.createEntityManager();
		
		try{
			emMy.getTransaction().begin();
			for(String docId:docIdList){
				/**
				 * 设置任务
				 */
				tItem = new TItem();
				//设置ID
				tItem.setDocId(docId);
				//设置日期
				tItem.setDispDate(new Timestamp(System.currentTimeMillis()));
				//保存一
				emMy.persist(tItem);
				
				//创建保存履历表,同时关联任务
				for(String disDTO: FormInfoList){
					/**
					 * 设置履历表各项信息
					 */
					tHist = new THist();
					……
					tHist.setTItem(tItem);
					//保存多
					emMy.persist(tDispHist);
				
			}
			//提交
			emMy.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			em.getTransaction().rollback();
		}finally{
			if(emMy.isOpen()){
				emMy.close();
			}
		}

 

       此文,没有讲解JPA相关的配置(像Persistence.createEntityManagerFactory("your_unit");中的“your_unit就是JPA的Persistence.xml文件配置中的信息”),仅仅通过一个实例简单说明JPA在插入数据上的用法,而更为重要的是分析和思考JPA等ORM工具在不同场景中是如何发挥作用的,其原理是什么!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是示例代码: **第一个数据表:User** ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private List<Order> orders = new ArrayList<>(); // 省略 getter 和 setter 方法 } ``` **第二个数据表:Order** ```java @Entity @Table(name = "order") public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") private User user; // 省略 getter 和 setter 方法 } ``` **插入数据** ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void saveUser() { User user = new User(); user.setName("张三"); Order order1 = new Order(); order1.setName("订单1"); order1.setUser(user); Order order2 = new Order(); order2.setName("订单2"); order2.setUser(user); user.getOrders().add(order1); user.getOrders().add(order2); userRepository.save(user); } } ``` **查询数据** ```java @Service public class UserService { @Autowired private UserRepository userRepository; public User getUser(Long id) { return userRepository.findById(id).orElse(null); } } ``` 在上面的示例中,User 和 Order 是一对多关系,User 拥有多个 Order。在 User 实体类中,使用 @OneToMany 注解来建立一对多关系,mappedBy 属性指定了 Order 实体类中的 user 属性来维护关系,cascade 属性设置了级联操作,orphanRemoval 属性设置了当 Order 实体类中的 user 属性为 null 时,该 Order 实例会被删除。 在 Order 实体类中,使用 @ManyToOne 注解来建立多对一的关系,fetch 属性设置了懒加载,JoinColumn 属性指定了外键的名称。 在插入数据时,先创建 User 实例,然后创建多个 Order 实例,并将这些 Order 实例的 user 属性设置为 User 实例,最后将 Order 实例添加到 User 实例的 orders 属性中,保存 User 实例即可。 在查询数据时,直接使用 UserRepository 的 findById 方法即可获取到 User 实例,该实例的 orders 属性中包含了多个 Order 实例。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值