ARTICLE AD BOX
I receive following error when I save the object using Hibernate
object references an unsaved transient instance - save the transient instance before flushing: com.quintiles.ra.model.Dashboard
This is my error log:
Caused by: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.quintiles.ra.model.Dashboard at org.hibernate.engine.internal.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:294) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.type.EntityType.getIdentifier(EntityType.java:537) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:311) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.type.ManyToOneType.isDirty(ManyToOneType.java:321) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.type.TypeHelper.findDirty(TypeHelper.java:294) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.persister.entity.AbstractEntityPersister.findDirty(AbstractEntityPersister.java:4243) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.DefaultFlushEntityEventListener.dirtyCheck(DefaultFlushEntityEventListener.java:546) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.DefaultFlushEntityEventListener.isUpdateNecessary(DefaultFlushEntityEventListener.java:232) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:159) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:231) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:102) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.event.internal.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:61) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.internal.SessionImpl.autoFlushIfRequired(SessionImpl.java:1191) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1675) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380) ~[hibernate-core-4.3.4.Final.jar:4.3.4.Final] at com.quintiles.ra.service.RaService.findProtocolQuarantine(RaService.java:2513) ~[ra-service-9.02.000.002-SNAPSHOT.jar:na] at com.quintiles.analytics.vaadin.newui.collectionfilter.DataContextState.getQuarantinedProtocols(DataContextState.java:109) ~[classes/:na] at com.quintiles.analytics.vaadin.newui.chart.ChartsLayout.getQuarantineProtocols(ChartsLayout.java:1069) ~[classes/:na] at com.quintiles.analytics.vaadin.newui.chart.ChartsLayout.<init>(ChartsLayout.java:254) ~[classes/:na] at com.quintiles.analytics.vaadin.newui.dashboard.DashboardLayout.<init>(DashboardLayout.java:158) ~[classes/:na] at com.quintiles.analytics.vaadin.newui.MonPage.makeMonPage(MonPage.java:170) ~[classes/:na] at com.quintiles.analytics.vaadin.newui.MonPage.<init>(MonPage.java:101) ~[classes/:na] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_432] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_432] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_432] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_432] at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142) ~[spring-beans-4.3.4.RELEASE.jar:4.3.4.RELEASE] ... 64 common frames omittedFor your reference, attaching ra.model.Dashboard
package com.quintiles.ra.model; import org.hibernate.annotations.Cascade; import org.hibernate.annotations.CascadeType; import org.hibernate.annotations.Fetch; import org.hibernate.annotations.FetchMode; import org.hibernate.annotations.Formula; import org.hibernate.annotations.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.persistence.*; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; @SuppressWarnings("serial") @Entity @Table(name="DASHBOARD") public class Dashboard extends EASSManagedObject implements Serializable { protected static final Logger LOGGER = LoggerFactory.getLogger(Dashboard.class); Long id; List<Tile> tiles; List<Visualization> visualizations; String ownerUserKey; Set<DataContextFilterType> filterTypes; Boolean hasImage; Boolean exportable; Boolean linkShareable; DashboardImage image; Set<Category> categories; Long gridId; Set<MenuItem> menuItems; Long dbMode; String modeType; QuickFilter quickFilter; Boolean showLabel; Long dashboardMenu; String displayLabel; Boolean usesHelp; DashboardStyle dashboardStyle; String whereClauseForQF; CategoryCollection categoryCollection; String commentedBy; Boolean viaForm; public Dashboard(){ enabled = false; exportable = false; linkShareable = false; viaForm = false; } @Id @SequenceGenerator( name="DashboardIDGenerator", sequenceName="DASHBOARD_SEQ", allocationSize=1) @GeneratedValue(generator = "DashboardIDGenerator") @Column(name="ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @ManyToMany() @JoinTable(name="DASHBOARD_TILE",joinColumns={ @JoinColumn(name="DASHBOARD_ID",referencedColumnName="ID",updatable=false) },inverseJoinColumns={ @JoinColumn(name="TILE_ID",referencedColumnName="ID") }) @OrderColumn(name="LIST_ORDER") @Cascade(value=CascadeType.SAVE_UPDATE) public List<Tile> getTiles() { if(tiles == null)tiles = new ArrayList<Tile>(); return tiles; } public void setTiles(List<Tile> tiles) { this.tiles = tiles; } @ManyToMany() @JoinTable(name="DASHBOARD_VISUALIZATION",joinColumns={ @JoinColumn(name="DASHBOARD_ID",referencedColumnName="ID",updatable=false) },inverseJoinColumns={ @JoinColumn(name="VISUALIZATION_ID",referencedColumnName="ID") }) @OrderColumn(name="LIST_ORDER") @Cascade(value=CascadeType.SAVE_UPDATE) public List<Visualization> getVisualizations() { if(visualizations == null)visualizations = new ArrayList<Visualization>(); return visualizations; } public void setVisualizations(List<Visualization> visualizations) { this.visualizations = visualizations; } @OneToMany(fetch=FetchType.EAGER) @JoinTable(name="DASHBOARD_CATEGORY",joinColumns={ @JoinColumn(name="DASHBOARD_ID",referencedColumnName="ID") },inverseJoinColumns={ @JoinColumn(name="CATEGORY_ID",referencedColumnName="ID") }) @OrderColumn(name="LIST_ORDER") //@Cascade(value=CascadeType.SAVE_UPDATE) public Set<Category> getCategories() { if(categories == null)categories = new LinkedHashSet<Category>(); return categories; } public void setCategories(Set<Category> categories) { this.categories = categories; } @Transient public List<Tile> getTilesNoNull() { List<Tile> tiles = new ArrayList<Tile>(getTiles()); tiles.removeAll(Collections.singleton(null)); return tiles; } @ElementCollection(fetch=FetchType.EAGER,targetClass=DataContextFilterType.class) @JoinTable (name="DASHBOARD_FILTER_TYPES", joinColumns=@JoinColumn(name="DASHBOARD_ID")) @Enumerated(EnumType.STRING) @Column (name="filterTypes", nullable=false) public Set<DataContextFilterType> getFilterTypes() { if(filterTypes == null)filterTypes = new HashSet<DataContextFilterType>(); return filterTypes; } public void setFilterTypes(Set<DataContextFilterType> filterTypes) { this.filterTypes = filterTypes; } @Column(name="OWNER_USER_KEY") public String getOwnerUserKey() { return ownerUserKey; } public void setOwnerUserKey(String ownerUserKey) { this.ownerUserKey = ownerUserKey; } @OneToOne(fetch=FetchType.LAZY,optional=false) @Fetch(FetchMode.SELECT) @PrimaryKeyJoinColumn public DashboardImage getImage() { if(image == null){ image = new DashboardImage(); } return image; } public void setImage(DashboardImage image) { this.image = image; } @Formula("case when IMAGE_DATA IS NULL then 0 else 1 end") public Boolean getHasImage() { return hasImage; } public void setHasImage(Boolean hasImage) { this.hasImage = hasImage; } @Transient public byte[] getImageData(){ return getImage().getData(); } public void setImageData(byte[] b){ getImage().setData(b); } @Transient public String getImageFileName(){ if(getImageData()!=null) return "dashboard-"+id+".png"; else return null; } @Column(name="DBMODE") public Long getDbMode() { return dbMode; } public void setDbMode(Long dbMode) { this.dbMode = dbMode; } @Column(name="MODE_TYPE") public String getModeType() { return modeType; } public void setModeType(String modeType) { this.modeType = modeType; } @Column(name="EXPORTABLE") @Type(type="yes_no") public Boolean getExportable() { return exportable; } public void setExportable(Boolean exportable) { this.exportable = exportable; } @Column(name="LINK_SHAREABLE") @Type(type="yes_no") public Boolean getLinkShareable() { return linkShareable; } public void setLinkShareable(Boolean linkShareable) { this.linkShareable = linkShareable; } @OneToOne(fetch=FetchType.LAZY) @JoinColumn(name="QUICK_FLTR_ID") @Fetch(FetchMode.JOIN) public QuickFilter getQuickFilter() { return quickFilter; } public void setQuickFilter(QuickFilter quickFilter) { this.quickFilter = quickFilter; } @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "CATEGORY_COLLECTION_ID") public CategoryCollection getCategoryCollection() { return categoryCollection; } public void setCategoryCollection(CategoryCollection categoryCollection) { this.categoryCollection = categoryCollection; } @Column(name="SHOW_LABEL") @Type(type="yes_no") public Boolean getShowLabel() { return showLabel; } public void setShowLabel(Boolean showLabel) { this.showLabel = showLabel; } @Column(name="MENU_ID") public Long getDashboardMenu() { return dashboardMenu; } public void setDashboardMenu(Long dashboardMenu) { this.dashboardMenu = dashboardMenu; } @Column(name="USESHELP") @Type(type="yes_no") public Boolean getUsesHelp() { return usesHelp; } @Lob @Column(name="WHEREFORQUICKFILTER") public String getWhereClauseForQF() { return whereClauseForQF; } public void setWhereClauseForQF(String whereClauseForQF) { this.whereClauseForQF = whereClauseForQF; } @Column(name="COMMNTD_BY") public String getCommentedBy() { return commentedBy; } public void setCommentedBy(String commentedBy) { this.commentedBy = commentedBy; } public void setUsesHelp(Boolean usesHelp) { this.usesHelp = usesHelp; } @Override public String toString() { return "Dashboard [id=" + id + ", name=" + name + ", displayLabel=" + displayLabel + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((id == null) ? 0 : id.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Dashboard other = (Dashboard) obj; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; return true; } @ManyToMany(fetch=FetchType.EAGER) @JoinTable(name="MENUITEM_DASHBOARD_LINK",joinColumns={ @JoinColumn(name="DASHBOARD_ID",referencedColumnName="ID") },inverseJoinColumns={ @JoinColumn(name="MENUITEM_ID",referencedColumnName="ID") }) public Set<MenuItem> getMenuItems() { if(menuItems == null)menuItems = new HashSet<MenuItem>(); return menuItems; } public void setMenuItems(Set<MenuItem> menuItems) { this.menuItems = menuItems; } @Column(name="DISPLAY_LABEL") public String getDisplayLabel() { return displayLabel; } public void setDisplayLabel(String displayLabel) { this.displayLabel = displayLabel; } @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name="CSSID") @Fetch(FetchMode.JOIN) public DashboardStyle getDashboardStyle() { return dashboardStyle; } public void setDashboardStyle(DashboardStyle dashboardStyle) { this.dashboardStyle = dashboardStyle; } @Transient public String getDisplayName(){ if(displayLabel != null)return displayLabel; else { return name; } } @Column(name = "VIA_LINK") @Type(type = "yes_no") public Boolean getViaForm() { return viaForm; } public void setViaForm(Boolean viaForm) { this.viaForm = viaForm; } }PS: I have tried adding cascade=CascadeType.ALL to all the ManyToOne, OneToOne etc conditions as well, but it doesn't seem to work.
