Solved

JPA Master-Detail Rollback Problem

Posted on 2012-03-21
1
919 Views
Last Modified: 2012-07-09
Hello everbody,

Normally, inserting master-detail object to database follow these steps.
1- insert master to database cache.
When error occurred, do rollback.
2- insert detail to database cache.
When error occurred, do rollback.
3-if no error, commit transaction.

But in jpa transaction rollback is not working same, I think.
I have two objects to persist. Like these:

public class ConditionKey implements Serializable {
      private static final long serialVersionUID = 1L;

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @Column(name = "KEY_ID")
      private Integer keyId;

      @OneToMany(mappedBy = "conditionKey", fetch = FetchType.EAGER, cascade =             CascadeType.ALL, orphanRemoval = true)
      private List<KeyOption> keyOptions;


@Entity
@Table(name = "KEY_OPTION")
public class KeyOption implements Serializable {
      private static final long serialVersionUID = 1L;

      @Id
      @GeneratedValue(strategy = GenerationType.SEQUENCE)
      @Column(name = "KEY_OPTION_ID")
      private Integer keyOptionId;

      @Column(name = "OPTION_VALUE")
      private String optionValue;

      @ManyToOne(fetch = FetchType.EAGER)
      @JoinColumn(name = "KEY_ID")
      private ConditionKey conditionKey;

KeyOption optionValue is unique in database.
When I call jpa persist I have trouble with these object. JPA insert ConditionKey to database cache. KeyOption optionValue is unique. When I insert already inserted optionValue
JPA throw en UniqunessException but ConditionKey is already changed. But database not.
How can I solve these rollback problem in JPA? (EclipseLink)

      public void insertConditionKey(ConditionKey conditionKey) throws Exception {
            EntityManager em = entityManagerFactory.createEntityManager();
            try {
                  em.getTransaction().begin();
                  em.persist(conditionKey);
                  em.flush();
                  em.getTransaction().commit();
            } catch (Exception e) {
                  if (em.getTransaction().isActive()) {
                        em.getTransaction().rollback();
                  }
                  throw e;
            } finally {
                  em.close();
            }
      }
0
Comment
Question by:akoyuncu
1 Comment
 
LVL 20

Accepted Solution

by:
chaitu chaitu earned 500 total points
Comment Utility
if exception is going into this block;put some debug there;

catch (Exception e) {
                  if (em.getTransaction().isActive()) {
log.debug("coming to exception");

                        em.getTransaction().rollback();
                  }
0

Featured Post

Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

Join & Write a Comment

Popularity Can Be Measured Sometimes we deal with questions of popularity, and we need a way to collect opinions from our clients.  This article shows a simple teaching example of how we might elect a favorite color by letting our clients vote for …
Java functions are among the best things for programmers to work with as Java sites can be very easy to read and prepare. Java especially simplifies many processes in the coding industry as it helps integrate many forms of technology and different d…
Viewers will learn about the regular for loop in Java and how to use it. Definition: Break the for loop down into 3 parts: Syntax when using for loops: Example using a for loop:
This video teaches viewers about errors in exception handling.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now