簡體   English   中英

java jpa hibernate在onetomany上回滾

[英]java jpa hibernate rollback on onetomany

我的 jpa 有一個模型表單頭,我認為它是父級

@Entity
@Table(name = "Form_Header")
public class FormHeader {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "header_id", nullable = false)
    private Long headerId;

    @OneToMany(
        mappedBy = "formHeader",
        cascade = CascadeType.ALL,
        orphanRemoval = true
    )
    private List<FormProdItem> formProdItem;

    -- more fields--

    -- getter and setter--

}

和另一個我認為是孩子的模型。 更多關於單向

@Entity
@Table(name = "Form_Prod_Item")
public class FormProdItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "item_id", nullable = false)
    private Long itemId;

    @Column(name = "header_id", nullable = false)
    private Long headerId;

    @ManyToOne(fetch = FetchType.LAZY)
    private FormHeader formHeader;

   -- more fields --

   -- getter and setter --

}

和我的 DAO 訪問數據庫

@Repository
@Transactional
public class FormHeaderDAO {

    @Autowired
    private EntityManager entityManager;

    public List<FormHeader> gettest() {
    
        try {
        
            String sql = " SELECT e FROM FromHeader e "
            + " WHERE  e.isDeleted = 0 ";
        
            Query query = entityManager.createQuery(sql, FormHeader.class);
        
        
            return (List<FormHeader>) query.getSingleResult();
        } catch (NoResultException e) {
            return null;
        } catch (Exception e) {
            return null;
        }
    }
}

我收到了這個錯誤,沒有任何進一步的細節

2020-09-16 09:19:10.324 ERROR 9624 --- [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 org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only] with root cause

org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only

即使我在 sql "join e.formProdIem f" 中添加錯誤也是一樣的,它不會提供更多的細節。 知道為什么嗎?

我的猜測是您收到了NonUniqueResultException,因為您的查詢返回了多個結果並且您調用了query.getSingleResult()但您沒有看到這一點,因為您正在捕獲異常並以靜默方式丟棄它們。 這是一個非常糟糕的主意。

@Slf4j
@Repository
@Transactional
public class FormHeaderDAO {

    @Autowired
    private EntityManager entityManager;

    public List<FormHeader> gettest() {
    
        try {
            String sql = " SELECT e FROM FromHeader e "
            + " WHERE  e.isDeleted = 0 ";
        
            Query query = entityManager.createQuery(sql, FormHeader.class);
        
            return (List<FormHeader>) query.getSingleResult();
        } catch (NoResultException e) {
            log.error(e)
            return null;
        } catch (NonUniqueResultException e) {
            log.error(e)
            return null;
        } catch (Exception e) {
            log.error(e)
            return null;
        }
    }
}

如果您沒有 Slf4j,請使用 System.err.println() 或斷點來確認您的代碼現在正在吞入哪種異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM