2015-10-08 45 views
0

我正在使用JPA和Hibernate 4.1 2.0我需要保存兩個主/明細表。我的問題是,詳細的例外情況,沒有在表中存儲任何數據。當JPA發生異常時回滾事務

下面顯示我的代碼。

@Entity 
@Table(name = "tblmaster") 
public class Master implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private Long id; 
    private String mail; 
    private List<Detail> listDetail = new ArrayList<Detail>(); 

    @Id 
    @Column(name = "secmaster", nullable = false, unique = true) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    @OneToMany(mappedBy = "master", cascade = CascadeType.ALL, targetEntity = Detail.class,fetch = FetchType.EAGER) 
    public List<Detail> getListDetail() { 
     return listDetail; 
    } 

    public void setListDetail(List<Detail> listaProgramaEducativo) { 
     this.listDetail = listDetail; 
    } 

    public void addDetail(Detail detail) { 
     listDetail.add(detail); 
     detail.setDetail(this); 
    } 



@Entity 
@Table(name = "tbldetail") 
public class Detail implements Serializable { 

    private static final long serialVersionUID = 1L; 
    private Long id;  
    private Master master; 

    @Id 
    @Column(name = "secdetail", nullable= false, unique = true) 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "secmaster") 
    public Master getMaster() { 
     return master; 
    } 

    public void setMaster(Master master) { 
     this.master = master; 
    } 

Master master = new Master(); 

master.setMail(「[email protected]」);

Detail detail1 = new Detail(); 
Detail detail2 = new Detail(); 

master.addDetail(detail1); 
master.addDetail(detail2); 
session.persist(master); 
master.addDetail(); 

在這個例子中,我正在通過字段的大小詳細說明一個例外。我需要的是,如果我詳細地創建一個例外不保留在主人。

回答

0

處理事務取決於您如何在代碼中創建事務。

如果你開始在你的代碼勢在必行提交事務,那麼你應該把整個交易在try..catch塊,如Hibernate Javadoc描述:

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    //do some work 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 

如果您使用事務豆(標要麼@Transactional註釋或EJB),那麼任何RuntimeException和某些類型的PersistenceException將導致事務自動回滾

相關問題