Как исправить ошибку «Объект Hibernate ссылается на несохраненный временный экземпляр — сохраните временный экземпляр пеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как исправить ошибку «Объект Hibernate ссылается на несохраненный временный экземпляр — сохраните временный экземпляр пе

Сообщение Anonymous »

Я получаю следующую ошибку при сохранении объекта с помощью Hibernate.
объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед очисткой: com.quintiles.ra.model.Dashboard
Это мой журнал ошибок:

Код: Выделить всё

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.(ChartsLayout.java:254) ~[classes/:na]
at com.quintiles.analytics.vaadin.newui.dashboard.DashboardLayout.(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.(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 omitted
Для справки, прикрепив 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 tiles;
List visualizations;
String ownerUserKey;
Set filterTypes;
Boolean hasImage;
Boolean exportable;
Boolean linkShareable;
DashboardImage image;
Set categories;
Long gridId;
Set 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 getTiles() {
if(tiles == null)tiles = new ArrayList();
return tiles;
}
public void setTiles(List 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 getVisualizations() {
if(visualizations == null)visualizations = new ArrayList();
return visualizations;
}
public void setVisualizations(List 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 getCategories() {
if(categories == null)categories = new LinkedHashSet();
return categories;
}
public void setCategories(Set categories) {
this.categories = categories;
}

@Transient
public List getTilesNoNull() {
List  tiles = new ArrayList(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 getFilterTypes() {
if(filterTypes == null)filterTypes = new HashSet();
return filterTypes;
}
public void setFilterTypes(Set  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 getMenuItems() {
if(menuItems == null)menuItems = new HashSet();
return menuItems;
}

public void setMenuItems(Set 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: Я также пробовал добавить cascade=CascadeType.ALL ко всем условиям ManyToOne, OneToOne и т. д., но, похоже, это не работает.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»