2016-03-10 36 views
0

我試圖保存Consumer.java的對象。但在做的,除了得到如下:預期:類java.lang.Integer,得到類org.hibernate.action.internal.DelayedPostInsertIdentifier

堆棧跟蹤如下:

org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.citruspay.common.domain.consumer.ConsumerDetail. Expected: class java.lang.Integer, got class org.hibernate.action.internal.DelayedPostInsertIdentifier 
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:134) 
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1106) 
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1025) 
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716) 
at org.hibernate.type.EntityType.resolve(EntityType.java:502) 
at org.hibernate.type.EntityType.replace(EntityType.java:366) 
at org.hibernate.type.AbstractType.replace(AbstractType.java:178) 
at org.hibernate.type.TypeHelper.replace(TypeHelper.java:227) 
at org.hibernate.event.internal.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:444) 
at org.hibernate.event.internal.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:249) 
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:189) 
at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:85) 
at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:876) 
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:858) 
at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:863) 
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:1196) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:344) 
at com.sun.proxy.$Proxy118.merge(Unknown Source) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:294) 
at com.sun.proxy.$Proxy118.merge(Unknown Source) 

代碼片段:

@Repository 
@Transactional 
public class ConsumerDAOImpl implements ConsumerDAO { 

    private static final Logger logger = LoggerFactory 
     .getLogger(ConsumerDAOImpl.class); 

    @PersistenceContext 
    private EntityManager em; 

    public Consumer saveOrUpdate(Consumer consumer) { 
     return em.merge(consumer); 
    } 
} 

調用方法em.merge當我得到異常(消費者) 。

實體類:

@Entity 
@Audited 
@Table(name = "CON_CONSUMER") 
public class Consumer implements Serializable { 

private static final long serialVersionUID = -8211543793922969543L; 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id;  

@Embedded 
private WalletPreference walletPreference; 
@NotNull 
@OneToOne 
private ConsumerDetail consumerDetail; 

@Temporal(TemporalType.TIMESTAMP) 
private Date created; 

@Temporal(TemporalType.TIMESTAMP) 
@Version 
private Date lastModified; 

@Enumerated(EnumType.STRING) 
private ConsumerStatus consumerFlag; 

@OneToOne(cascade=CascadeType.ALL, fetch=FetchType.LAZY) 
@Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) 
private CPUser cpUser; 

@OneToMany(mappedBy="consumer" ,cascade=CascadeType.ALL) 
@Where(clause="deleted <> '1'") 
private List<ConsumerCustomParameter> customParameter; 

public Consumer() { 
} 

public Consumer(String firstName, String lastName, Address contactAddress, List<PhoneNumber> phoneNumber) { 
    super();  
    this.created = new Date(); 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public WalletPreference getWalletPreference() { 
    return walletPreference; 
} 

public void setWalletPreference(WalletPreference walletPreference) { 
    this.walletPreference = walletPreference; 
} 

public Date getCreated() { 
    return created; 
} 

public void setCreated(Date created) { 
    this.created = created; 
} 

public Date getLastModified() { 
    return lastModified; 
} 

public void setLastModified(Date lastModified) { 
    this.lastModified = lastModified; 
} 

public ConsumerDetail getConsumerDetail() { 
    return consumerDetail; 
} 

public void setConsumerDetail(ConsumerDetail consumerDetail) { 
    this.consumerDetail = consumerDetail; 
} 

public ConsumerStatus getConsumerFlag() { 
    return consumerFlag; 
} 

public void setConsumerFlag(ConsumerStatus consumerFlag) { 
    this.consumerFlag = consumerFlag; 
} 

public CPUser getCPUser(){ 
    return cpUser; 
} 

public void setCPUser(CPUser cpUser) { 
    this.cpUser = cpUser; 
} 

public List<ConsumerCustomParameter> getCustomParameter() { 
    return customParameter; 
} 

public void setCustomParameter(List<ConsumerCustomParameter> customParameter) { 
    this.customParameter = customParameter; 
} 

@Override 
public String toString() { 
    return "Consumer [id=" + id + ", created=" + created 
      + ", lastModified=" + lastModified + ", consumerFlag=" 
      + consumerFlag + ", customParameter=" + customParameter + "]"; 
} 

代碼爲節省消費者POJO:

public class ConsumerProfileServiceImpl implements ConsumerProfileService  { 

    @Autowired 
    private ConsumerDAO consumerDAO; 

    @Transactional 
    public Consumer createConsumer(CPUser cpUser, DefaultPerson person) { 
     Consumer consumer = new Consumer(); 
     ConsumerDetail consumerDetail = //setting consumer details 

     consumer.setCreated(new Date()); 
     consumer.setConsumerFlag(ConsumerStatus.ENABLED); 

     consumer.setCPUser(); // set it to some cpuser object 

     ConsumerDetail savedConsumerDetails = consumerDetailDAO 
      .saveOrUpdate(consumerDetail); 
     consumer.setConsumerDetail(savedConsumerDetails); 

     consumer = consumerDAO.saveOrUpdate(consumer); 
    } 
} 

我使用Hibernate的版本4.3.11.Final,春天4.2.5.RELEASE。

+0

你也可以發佈你的pojos嗎? 'Consumer','ConsumerDetail'等等?還有一個複製問題的小例子?例如創建一個新的「消費者」設置一些數據並試圖保存它。 – pleft

回答

1

如何試圖

一)在消費類

@OneToOne(cascade=CascadeType.ALL) 
private ConsumerDetail consumerDetail; 

二)在ConsumerProfileServiceImpl類createCustomer方法不保存consumerDetail對象,讓節約consumer處理。

//ConsumerDetail savedConsumerDetails = consumerDetailDAO 
//  .saveOrUpdate(consumerDetail); 
consumer.setConsumerDetail(consumerDetail); 

consumer = consumerDAO.saveOrUpdate(consumer); 
+0

它工作。謝謝@elefasGR!但是現在得到另一個異常'java.lang.ClassCastException:org.hibernate.action.internal.DelayedPostInsertIdentifier不能轉換爲java.lang.Long'。我應該在這裏添加還是問另一個問題? – Dhairyashil

+0

其實我想保存數據,然後在其他選擇查詢中使用它的ID。我們如何做到這一點?我的意思是,如果我想堅持消費者對象,然後想在下一個方法中使用它的ID,我們可以這樣做嗎?如果是,那麼如何? – Dhairyashil

+0

您的第一條評論是否與您提到的我的解決方案的工作方式相同?只有而不是'Integer'你會得到'Long'。這可能是因爲在你的'ConsumerDetails'對象中,id的類型是'Integer',而'Consumer'對象的id是'Long'類型。難道你不能以相同的方式排除故障嗎?對於第二條評論,答案是肯定的。但向我們展示一些你的代碼你爲了幫助你想要做什麼 – pleft

相關問題