java - Hibernate: Can't use CascadeType.PERSIST -
i have in db categories , items related in many many. goal when add items items list in category, these items automatically added db. thought annotating list of items in category cascadetype.persist work, doesn't. putting cascasetypes enum values doesn't work. each time following exception when committing transaction:
org.hibernate.transientobjectexception: object references unsaved transient instance - save transient instance before flushing: il.co.site_building.webutils.shop.item only when annotate cascadetype.all, items saved properly.
the code category:
public category(integer uid, string name, string displayname, category parent, list<category> subcategories, list<item> items){ m_uid = uid; m_name = name; m_displayname = displayname; m_parent = parent; m_subcategories = subcategories; m_itemsincategory = items != null ? items : new linkedlist<>(); } @manytomany(cascade = cascadetype.persist) //doesn't work. cascadetype.all work. @jointable(name = "items_categories", joincolumns = {@joincolumn(name="category") }, inversejoincolumns = {@joincolumn(name = "item")}) public list<item> getitemsincategory(){return m_itemsincategory;} the code item:
public item(integer uid, string name, string displayname, string description, bigdecimal price, integer orderindex, string serialno, attributetype attributetype, list<itemattribute> itemattributes, list<category> categories){ m_uid = uid; m_name = name; m_displayname = displayname; m_description = description; m_price = price.setscale(price_scale); m_orderindex = orderindex; m_serialno = serialno; m_attributetype = attributetype; m_itemattributes = itemattributes != null ? itemattributes : new linkedlist<>(); m_categories = categories != null? categories : new linkedlist<>(); } @manytomany(mappedby = "itemsincategory") public list<category> getcategories(){return m_categories;} the code inserting items (assuming category exists):
public static final string shirt_name = "shirt"; public static final string shirt_display_name = "shirt display"; public static final string shirt_description = "shirt description"; public static final bigdecimal shirt_price = new bigdecimal("2.01"); public static final integer shirt_order_index = 1; public static final string shirt_serial_number = "shirt_sn"; public static final item shirt = new item(null, shirt_name, shirt_display_name, shirt_description, shirt_price, shirt_order_index, shirt_serial_number, attributetypetest.attribute_type_size, null, null); session.begintransaction(); query query.setparameter("uid", categorytest.category_shirts.getuid()); //this category persisted somewhere else category category = (category)query.uniqueresult(); list<item> itemsincategory = category.getitemsincategory(); shirt.getcategories().add(category); itemsincategory.add(shirt); session.gettransaction().commit();
so hibernate problem when using native api jpa annotated classes.
hibernate not persist child objects when relationship annotated cascadetype.persist cascadetype.all annotated relationships.
however, if use hibernate via jpa api (so entitymanger instead of session, rest of code identical), both cascadetype.persist , cascadetype.all triggers persistence of child elements. apparently part of jpa specification (thanks chris pointing out) if omitted in javadocs. mistakenly believed explicit persist() requests cascaded.
if not late project, may consider using jpa standard instead of hibernate api. transition seamless new code (persist instead of save, remove instead of delete ....)
Comments
Post a Comment