【问题标题】:Error when retrieving values from MS SQL using Hibernate使用 Hibernate 从 MS SQL 检索值时出错
【发布时间】:2021-02-14 22:36:03
【问题描述】:

我已经完成了一个程序,我必须从 MS SQL 的表中检索数据。我正在使用Hibernate,其中AbtDebtbyCANEntity 类。到目前为止的连接很好,但我面临的唯一问题是使用 Annotation Mapping 从 MS SQL 打印数据。 Debt是要映射的表名(表名小写)。下面是我想使用Hibernate 打印出来的结果。谁能帮我实现数据的获取?

债务

  id          can           bdrl_debt    excess_ta_debt      posting_ref   debt_settlement_id   debt_settlement_at       debt_business_date
  
11425   1099112400000003        0              200             501728             137        2020-10-13 10:51:50.000         2020-10-13 

AbtDebtbyCAN

@Data
@Entity
@Table(name = "debt")
public class AbtDebtbbyCAN implements Serializable{

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int debt_id;

@Column(name = "can")
private int debt_can;

@Column(name = "bdrl_debt")
private int bdrl_debt;

@Column(name = "excess_ta_debt")
private int excess_ta_debt;

@Column(name = "posting_ref")
private int posting_ref;

@Column(name = "debt_settlement_id")
private int debt_settlement_id;

@Column(name = "debt_settlement_at")
private DateTime debt_settlement_at;

@Column(name = "debt_business_date")
private Date debt_business_date;

}

AbtCANMapperTest

public class AbtCANMapperTest {
    public static void main(String args[]) {

    StandardServiceRegistry ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
    Metadata meta = new MetadataSources(ssr).getMetadataBuilder().build();

    SessionFactory factory = meta.getSessionFactoryBuilder().build();




        Session session = factory.openSession();
        Transaction tx = null;

        try {
            tx = session.beginTransaction();
            List abtdebt = session.createQuery("FROM AbtDebtbbyCAN WHERE debt_can=1099112400000003").getResultList();
            for (Iterator iterator = abtdebt.iterator(); iterator.hasNext(); ) {
                AbtDebtbbyCAN abtcan = (AbtDebtbbyCAN) iterator.next();
                System.out.print("debt id: " + abtcan.getDebt_id());
                System.out.print("debt can: " + abtcan.getDebt_can());
                System.out.print("bdrl debt: " + abtcan.getBdrl_debt());
                System.out.print("excess debt: " + abtcan.getExcess_ta_debt());
                System.out.print("posting ref: " + abtcan.getPosting_ref());
                System.out.print("debt settlement id: " + abtcan.getDebt_settlement_id());
                System.out.print("debt settlement at: " + abtcan.getDebt_settlement_at());
                System.out.println("debt business date: " + abtcan.getDebt_business_date());
            }
            tx.commit();
        } catch (HibernateException e) {
            if (tx != null) tx.rollback();
            e.printStackTrace();
        } finally {
            session.close();
        }


}
}

错误堆栈跟踪

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1542)
    at org.hibernate.query.Query.getResultList(Query.java:165)
    at AbtMainTestControl.AbtTestObj.AbtCANMapperTest.main(AbtCANMapperTest.java:36)
Caused by: org.hibernate.type.SerializationException: could not deserialize
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:243)
    at org.hibernate.internal.util.SerializationHelper.deserialize(SerializationHelper.java:287)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.fromBytes(SerializableTypeDescriptor.java:138)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:113)
    at org.hibernate.type.descriptor.java.SerializableTypeDescriptor.wrap(SerializableTypeDescriptor.java:29)
    at org.hibernate.type.descriptor.sql.VarbinaryTypeDescriptor$2.doExtract(VarbinaryTypeDescriptor.java:60)
    at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:47)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:257)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
    at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:243)
    at org.hibernate.type.AbstractStandardBasicType.hydrate(AbstractStandardBasicType.java:329)
    at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:3088)
    at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1907)
    at org.hibernate.loader.Loader.hydrateEntityState(Loader.java:1835)
    at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1808)
    at org.hibernate.loader.Loader.getRow(Loader.java:1660)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:745)
    at org.hibernate.loader.Loader.getRowsFromResultSet(Loader.java:1044)
    at org.hibernate.loader.Loader.processResultSet(Loader.java:995)
    at org.hibernate.loader.Loader.doQuery(Loader.java:964)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:350)
    at org.hibernate.loader.Loader.doList(Loader.java:2887)
    at org.hibernate.loader.Loader.doList(Loader.java:2869)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2701)
    at org.hibernate.loader.Loader.list(Loader.java:2696)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:506)
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
    at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
    at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1415)
    at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1565)
    at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1533)
    ... 2 more
Caused by: java.io.StreamCorruptedException: invalid stream header: 0000AC53
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:899)
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:357)
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:309)
    at org.hibernate.internal.util.SerializationHelper$CustomObjectInputStream.<init>(SerializationHelper.java:299)
    at org.hibernate.internal.util.SerializationHelper.doDeserialize(SerializationHelper.java:218)
    ... 32 more
Caused by: org.hibernate.type.SerializationException: could not deserialize


> Task :AbtCANMapperTest.main() FAILED

Caused by: java.io.StreamCorruptedException: invalid stream header: 0000AC53

Execution failed for task ':AbtCANMapperTest.main()'.
> Process 'command 'C:/Program Files/Java/jdk1.8.0_241/bin/java.exe'' finished with non-zero exit value 1

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

【问题讨论】:

  • 谁能告诉我这是什么问题?我很想得到答案
  • 16 位的can 值实际上会反序列化为Java int 吗?也许您需要 long 代替?
  • @AlwaysLearning 我会先尝试一下。似乎只有当所有变量都具有与 MS SQL 表中对象的互补数据类型时,Hibernate 映射才有效?我是否符合这条线?
  • @AlwaysLearning 我仍然遇到同样的错误。我该如何解决?
  • 我已经设法解决了。我对所有变量都使用了String,并设法检索到它。

标签: java sql-server hibernate entity


【解决方案1】:

不确定您在此处使用的确切类型,但至少 DateTime 不是 Hibernate 支持的标准类型。如果 Hibernate 不知道某个类型,它会尝试将其序列化形式的值刷新为 blob/byte[]。如果您使用 java.sql.Timestampjava.util.Calendar 或任何其他 Hibernate 开箱即用支持的类型,这应该可以正常工作。

【讨论】:

  • 最初,我选择了 DateTime,因为我的变量的数据类型必须与 MS SQL 中对象的数据类型相匹配。但是,在意识到它无法反序列化的事实后,我将其更改为String
猜你喜欢
  • 2021-02-15
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多