应为:类java.lang.Integer,获得类org.hibernate.action.internal.DelayedPostInsertIdentifier
我试图保存Consumer.java的对象。但在执行此操作时,会出现以下异常: 堆栈跟踪如下所示:应为:类java.lang.Integer,获得类org.hibernate.action.internal.DelayedPostInsertIdentifier,java,spring,hibernate,Java,Spring,Hibernate,我试图保存Consumer.java的对象。但在执行此操作时,会出现以下异常: 堆栈跟踪如下所示: 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.inte
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(consumer)时出现异常
实体类:
@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 + "]";
}
我使用的是Hibernate版本4.3.11.Final,Spring4.2.5.RELEASE。试一试怎么样
a) 消费者阶层
@OneToOne(cascade=CascadeType.ALL)
private ConsumerDetail consumerDetail;
b) 在ConsumerProfileServiceImpl类createCustomer
方法中,不要保存consumerDetail
对象,让保存consumer
来处理它
//ConsumerDetail savedConsumerDetails = consumerDetailDAO
// .saveOrUpdate(consumerDetail);
consumer.setConsumerDetail(consumerDetail );
consumer = consumerDAO.saveOrUpdate(consumer);
你也可以发布你的POJO吗<代码>消费者,
消费者详细信息
等?还有一个复制问题的小例子?e、 g.创建一个新的消费者设置一些数据并尝试保存。它成功了。谢谢@elefasGR!但是现在得到另一个异常java.lang.ClassCastException:org.hibernate.action.internal.DelayedPostInsertIdentifier无法转换为java.lang.Long
。我应该把它添加到这里还是问另一个问题?实际上我想要持久化数据,然后在其他select查询中使用它的id。我们怎么做?我的意思是,如果我想持久化消费者对象,然后想在下一个方法中使用它的Id,我们可以这样做吗?如果可以,那么怎么做?对于您的第一个评论,这不是与您提到的我的解决方案工作的上述错误相同吗?只会得到Long
,而不是Integer
。这可能是因为在ConsumerDetails
对象中,id的类型为Integer
,而在Consumer
对象中,id的类型为Long
。你不能用同样的方法排除故障吗?对于第二个评论,答案是肯定的,我们可以。但是,让我们看看你的一些代码,你想做什么来帮助你
//ConsumerDetail savedConsumerDetails = consumerDetailDAO
// .saveOrUpdate(consumerDetail);
consumer.setConsumerDetail(consumerDetail );
consumer = consumerDAO.saveOrUpdate(consumer);