【问题标题】:Spring Data JPA throwing exceptionSpring Data JPA 抛出异常
【发布时间】:2016-05-05 09:57:00
【问题描述】:

使用 Spring data JPA 进行 curd 操作。在控制器中获取Exception occurred 消息。请在下面找到相同的代码。还有附加的堆栈跟踪。

采购类:

@Entity
@Table(name="purchases")
public class Purchases {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long orderId;

    @Temporal(TemporalType.TIMESTAMP)
    private Date creation_time;


    @Column(name="user_id")
    private Long userId;

    @Column(name="isbn")
    private Long isbn;

    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="user_id",insertable=false, updatable=false)
    private User user;


    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="isbn",insertable=false, updatable=false)
    private Books book;
    //setters and getters
}

采购存储库 -

@Transactional
public interface PurchasesRepository extends CrudRepository<Purchases, Long>{

    List<Purchases> findByUserId(Long userId);  
    List<Purchases> findByIsbn(Long isbn);
}

采购控制人 -

@RequestMapping(value="/purchase",method=RequestMethod.POST)
public @ResponseBody Purchases purchase(@RequestBody Purchases purchases)throws Exception{
    Books book=null;
    User user=null;
    Purchases purchase=null;
    Date creation_date=new Date();

    if(purchases.getOrderId()==null){

        //check whether book exists in the database 
        book=booksDAO.findOne(purchases.getIsbn());
        user=userDAO.findOne(purchases.getUserId());
        if(book==null || user==null){
            throw new Exception("Entered book isbn or user id not found !!!");          
        }
        System.out.println(">>>>>>>>>>>> Book and user exists in the databse <<<<<<<<<<<<<<<<");
        System.out.println(">>> user.getId()=["+user.getId()+"]>>>>>> book.getIsbn()=["+book.getIsbn());
        System.out.println("<<< purchaseDAO.findByUserId(user.getId())="+purchaseDAO.findByUserId(user.getId())+"<<<<<<<purchaseDAO.findByIsbn(book.getIsbn())="+purchaseDAO.findByIsbn(book.getIsbn()));

        //check for book already purchase by the customer
        if(purchaseDAO.findByUserId(user.getId())!=null){
            if(purchaseDAO.findByIsbn(book.getIsbn())==null){
                purchase = new Purchases(null,creation_date,purchases.getUserId(),purchases.getIsbn());
                purchaseDAO.save(purchase);
                purchase.setBook(book);
                purchase.setUser(user);
            }else{                  //checking of the isbn 
                throw new Exception("Book already purchased !!!");              
            }
        }else{          //checking fo the user existing
            purchase = new Purchases(null,creation_date,purchases.getUserId(),purchases.getIsbn());
            purchaseDAO.save(purchase);
            purchase.setBook(book);
            purchase.setUser(user);
        }
    }else{              //first if checking 
        throw new Exception(" Order_id already used !!! ");
    }
    return purchase;
} 

采购控制器类-

@RequestMapping(value="/purchase",method=RequestMethod.POST)
public @ResponseBody Purchases purchase(@RequestBody Purchases purchases)throws Exception{
    Books book=null;
    User user=null;
    Purchases purchase=null;
    Date creation_date=new Date();

    if(purchases.getOrderId()==null){

        //check whether book exists in the database 
        book=booksDAO.findOne(purchases.getIsbn());
        user=userDAO.findOne(purchases.getUserId());
        if(book==null || user==null){
            throw new Exception("Entered book isbn or user id not found !!!");          
        }
        System.out.println(">>>>>>>>>>>> Book and user exists in the databse <<<<<<<<<<<<<<<<");
        System.out.println(">>> user.getId()=["+user.getId()+"]>>>>>> book.getIsbn()=["+book.getIsbn());
        System.out.println("<<< purchaseDAO.findByUserId(user.getId())="+purchaseDAO.findByUserId(user.getId())+"<<<<<<<purchaseDAO.findByIsbn(book.getIsbn())="+purchaseDAO.findByIsbn(book.getIsbn()));

        //check for book already purchase by the customer
        if(purchaseDAO.findByUserId(user.getId())!=null){
            if(purchaseDAO.findByIsbn(book.getIsbn())==null){
                purchase = new Purchases(null,creation_date,purchases.getUserId(),purchases.getIsbn());
                purchaseDAO.save(purchase);
                purchase.setBook(book);
                purchase.setUser(user);
            }else{                  //checking of the isbn 
                throw new Exception("Book already purchased !!!");              
            }
        }else{          //checking fo the user existing
            purchase = new Purchases(null,creation_date,purchases.getUserId(),purchases.getIsbn());
            purchaseDAO.save(purchase);
            purchase.setBook(book);
            purchase.setUser(user);
        }
    }else{              //first if checking 
        throw new Exception(" Order_id already used !!! ");
    }
    return purchase;
}

使用 spring boot 运行应用程序。在第三个 system.out 行中获取异常。我尝试在 Purchases Repository 类而不是 List 中使用 Purchases 类作为返回类型,但仍然没有影响。请找到堆栈跟踪。

Hibernate: select user0_.user_id as user_id1_2_0_, user0_.contact as contact2_2_0_, user0_.email as email3_2_0_, user0_.name as name4_2_0_ from user_details user0_ where user0_.user_id=?
>>>>>>>>>>>> Book and user exists in the databse <<<<<<<<<<<<<<<<
>>> user.getId()=[6]>>>>>> book.getIsbn()=[6
Hibernate: select purchases0_.order_id as order_id1_1_, purchases0_.isbn as isbn3_1_, purchases0_.creation_time as creation2_1_, purchases0_.user_id as user_id4_1_ from purchases purchases0_ where purchases0_.user_id=?
Hibernate: select purchases0_.order_id as order_id1_1_, purchases0_.isbn as isbn3_1_, purchases0_.creation_time as creation2_1_, purchases0_.user_id as user_id4_1_ from purchases purchases0_ where purchases0_.isbn=?
<<< purchaseDAO.findByUserId(user.getId())=Exception occurred !!!<<<<<<<purchaseDAO.findByIsbn(book.getIsbn())=Exception occurred !!!
Hibernate: select purchases0_.order_id as order_id1_1_, purchases0_.isbn as isbn3_1_, purchases0_.creation_time as creation2_1_, purchases0_.user_id as user_id4_1_ from purchases purchases0_ where purchases0_.user_id=?
Hibernate: select purchases0_.order_id as order_id1_1_, purchases0_.isbn as isbn3_1_, purchases0_.creation_time as creation2_1_, purchases0_.user_id as user_id4_1_ from purchases purchases0_ where purchases0_.isbn=?
2016-05-05 14:59:47.088 ERROR 12207 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.Exception: Book already purchased !!!] with root cause

【问题讨论】:

  • 首先没有堆栈跟踪。其次,我建议您创建最小的失败示例,因为人们通常没有足够的时间深入研究一些大段代码。这只是友好的建议,应该可以帮助您获得一些答案
  • @JanZyka 检查第三个System.out.println 抛出异常的行。只贴了一部分。这两行都存在于控制器类和堆栈跟踪中,只有那一行有问题。
  • 这正在发生...throw new Exception("Book already purchased !!!") 但是purchaseDAO.findByUserId(user.getId())!=null)purchaseDAO.findByIsbn(book.getIsbn())==null 有什么关系?如果有用户 X 的购买并且有书籍 A 的购买?但这不一定是相同的购买,不是吗?您正在分别测试它们...因此,如果用户 X 购买了 B 书并且用户 Y 购买了 A 书,则用户 X 不能再购买 A 而用户 Y 不能再购买 B...?我还建议制作更短的方法,这将大大提高您的代码清晰度。
  • @FlorianSchaetz 感谢您的帮助。已经解决了问题,对于purchaseDAO.findByUserId(user.getId())!=null)purchaseDAO.findByIsbn(book.getIsbn())==null) 我已经将其更改为另一种方法。

标签: spring-boot spring-data spring-data-jpa spring-data-rest


【解决方案1】:

在第三个打印语句中发生异常,因为购买模型类是使用 toString() 定义的作为打印异常消息。后来,我想通了,改了,结果是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2020-06-08
    • 2017-02-12
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多