java - 预期为 : class java. lang.Integer,得到类 org.hibernate.action.internal.DelayedPostInsertIdentifier

标签 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.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 + "]";
}

保存消费者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、Spring 4.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);

关于java - 预期为 : class java. lang.Integer,得到类 org.hibernate.action.internal.DelayedPostInsertIdentifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35914411/

相关文章:

java - 如何将枚举与分组和子分组层次结构/嵌套一起使用

java - 如何在这里杀死reverseTimer

java - Spring中实现基于字段过滤的方法

java - Spring MVC 应用程序,尝试在 tomcat 上运行

java - gradle + spring MVC + spring boot + jsp = 404错误?

java - hibernate buildSessionFactory类格式错误:

java - 如何从 Firebase 列表中包含的分支获取数据

java - 如何从 hibernate 中同一个表的结果中获取表中的数据

spring - hibernate : Single out a column containing binary data which shouldn't be loaded

java - android: google APi OAuth 2.0 - 获取用户信息时出现错误 400