views:

794

answers:

2

Hi all. I'm curious and need to find this answer quick. Google won't help much.

The Java Persistece API has these properties that tell the framework to cascade operations on associated entities:

CascadeType.PERSIST
CascadeType.DELETE
CascadeType.MERGE
CascadeType.REFRESH

I know what the first two mean: when I persist object A which has B, persist B as well, and when I delete A, delete B as well.

But I can't make any sense of what the other two accomplish. Help?

A: 

JPA Annotation Meaning for Many to Many relationships:

  • ALL - all possible cascading operations performed on the source entity are cascaded to the target of the association.
  • MERGE - if the source entity is merged, the merge is cascaded to the target of the association.
  • PERSIST - if the source entity is persisted, the persist is cascaded to the target of the association.
  • REFRESH - if the source entity is refreshed, the refresh is cascaded to the target of the association.
  • REMOVE - if the source entity is removed, the target of the association is also removed.

I myself see them this way (more readable):

  • PERSIST is create new records from object in the database.
  • Delete is, well, delete.
  • MERGE, for existing objects, to merge the existing data in the table with the data in my object. (sync to database)
  • REFRESH is to refresh the data in the object. Perhaps there was a change on the database which needs to be synced. (sync from database)
altCognito
The Javadoc for the annotations didn't clear anything up for me. Thanks for the answer!
André Neves
+2  A: 

REFRESH means "pull any state changes from the database into my representation". Cascading this is simple; it means that all associated entities are refreshed.

MERGE means something complex that approximates "save" but is more like "push this detached entity back into managed status and save its state changes"; the cascading means that all associated entities get pushed back the same way, and the managed-entity handle you get back from .merge() has all managed entities associated with it.

Link to one instance of the relevant docs

chaos
Thank you for explaining this. I've been very confused about this issue too...
kosoant
@chaos, What is the default (if we didnt set any CascadeType), and what is the most sensible/common to set?
Rosdi