繁体   English   中英

添加二级缓存后,Hibernate无法在数据库中找到实体

[英]Hibernate unable to find entity in the database after adding second level cache

添加2级缓存后,休眠状态将为实体返回null。 Hibernate为实体(TrackingItem)返回null,因为它在缓存中找不到ManyToOne关系(Navigation)。 当它尝试查询数据库的导航时,即使数据库中存在查询,查询也会返回0行。 如果没有2级缓存,hibernate便可以在数据库中找到该实体。

这是我的环境:
伺服器:JBoss EAP 6.1
Hibernate 4.2.0。最终版
Infinispan:5.2.6。决赛

我读和重读infinspan引导设立二级缓存这里的二级缓存以及Hibernate文档这里

我当前正在将CacheConcurrencyStrategy.TRANSACTIONAL与Container Managed Transactions保持数据库和缓存同步,根据文档,Infinispan支持CacheConcurrencyStrategy.TRANSACTIONAL。

以下是2个实体(TrackingItem和Navigation),这些不相关的字段和方法已从实体中删除。

TrackingItem.java

@Cacheable
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(name = "TRACKING_ITEM")
@IdClass(IdPartitionDateCompositePk.class)
public class TrackingItem extends AbstractEntity<IdPartitionDateCompositePk> {

    @Id
    @Column(name = "TRACKING_ITEM_ID", nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "TRACKING_ITEM_SEQ_GENERATOR")
    @SequenceGenerator(name = "TRACKING_ITEM_SEQ_GENERATOR", sequenceName = "TRACKING_ITEM_SEQ", allocationSize = 1)
    private Long id;
    @Id
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "PARTITION_DT", nullable = false, updatable = false)
    private Date partitionDate = new Date();
    @JoinColumn(name = "AVG_ICL_STA_VLD_VAL_ID", referencedColumnName="CLS_VLD_VAL_ID", nullable = false, updatable = false)
    @ManyToOne(optional = false)
    private ClassificationValidValue averageInclusionStatus;
    @OneToOne
    @JoinColumns({
        @JoinColumn(name = "FILE_ID",nullable = true,updatable = true),
        @JoinColumn(name = "FILE_PARTITION_DT",nullable = true,updatable = true)
    })
    private File file;
    @ManyToOne(optional = true)
    @JoinColumn(name = "EAE_INCLUSION_STA_VLD_VAL_ID", referencedColumnName="CLS_VLD_VAL_ID", nullable = true, updatable = true)
    private ClassificationValidValue exceptionStatus;
    //The navigation is not found in the cache and is then queried by hibernate.
    @ManyToOne(optional = true)
    @JoinColumns({
        @JoinColumn(name = "NAVIGATION_ID", nullable = true, updatable = true),
        @JoinColumn(name = "NAVIGATION_PARTITION_DT",nullable = true,updatable = true)
    })
    private Navigation navigation;
    @JoinColumn(name = "SOURCE_SYSTEM_ID", nullable = false)
    @ManyToOne(optional = false      private SonarApplication sourceSystem;
}

Navigation.java

@Cacheable
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@Entity
@Table(name = "NAVIGATION")
@IdClass(IdPartitionDateCompositePk.class)
public class Navigation extends AbstractEntity<IdPartitionDateCompositePk> {
    @Id
    @Column(name = "NAVIGATION_ID", nullable = false, updatable = false)
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "NAVIGATION_SEQ_GENERATOR")
    @SequenceGenerator(name = "NAVIGATION_SEQ_GENERATOR", sequenceName = "NAVIGATION_SEQ", allocationSize = 1)
    private Long id;
    @Id
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "PARTITION_DT", nullable = false, updatable = false)
    private Date partitionDate = new Date();

    @JoinColumns({
        @JoinColumn(name = "NAVIGATION_ID"),
        @JoinColumn(name = "NAVIGATION_PARTITION_DT")
    })
    @OneToMany
    private Set<TrackingItem> trackingItems = new HashSet<TrackingItem>();

}

infinispan子系统中的Standalone.xml Hibernate 2级缓存配置

<subsystem xmlns="urn:jboss:domain:infinispan:1.4">
    <cache-container name="hibernate" default-cache="local-query" module="org.jboss.as.jpa.hibernate:4">
        <transport lock-timeout="60000"/>
        <local-cache name="local-query">
            <transaction mode="NONE"/>
            <eviction strategy="LRU" max-entries="100000"/>
            <expiration max-idle="300000"/>
        </local-cache>
        <invalidation-cache name="entity" mode="SYNC">
            <transaction mode="NON_XA"/>
            <eviction strategy="LRU" max-entries="100000"/>
            <expiration max-idle="300000"/>
        </invalidation-cache>
        <replicated-cache name="timestamps" mode="ASYNC">
            <transaction mode="NONE"/>
            <eviction strategy="NONE"/>
        </replicated-cache>
    </cache-container>
</subsystem>

Persistence.xml属性

<properties>
    <property name="jboss.as.jpa.providerModule" value="org.hibernate"/>
    <property name="jboss.as.jpa.adapterModule" value="org.jboss.as.jpa.hibernate:4"/>
    <property name="jboss.as.jpa.adapterClass" value="org.jboss.as.jpa.hibernate4.HibernatePersistenceProviderAdaptor"/>
    <property name="hibernate.show_sql" value="false"/>
    <property name="hibernate.format_sql" value="false"/>
    <property name="hibernate.hbm2ddll.auto" value="validate"/>
    <property name="hibernate.cache.use_query_cache" value="false" />
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    <property name="hibernate.cache.generate_statistics" value="true" />
    <property name="hibernate.cache.use_structured_entries" value="false" />
    <property name="hibernate.cache.infinispan.statistics" value="false"/>
    <property name="hibernate.cache.infinispan.use_synchronization" value="true"/> 
    <property name="hibernate.cache.region.factory_class" value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory"/>            
    <property name="hibernate.cache.infinispan.cachemanager" value="java:jboss/infinispan/hibernate" />
    <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.CMTTransactionFactory"/>
    <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
</properties>

最后,这是一个日志记录,其中设置了hibernate,infinispan和jboss.jdbc.spy进行跟踪,以查看hibernate为什么返回Null跟踪项。 我已将最重要的行加粗,并添加了一些注释。

INFO(com.test.analyze.TrackingItemLinkNode)resolveEntity:正在解析的实体密钥:IdPartitionDateCompositePk {id = 2766422,partitionDate = 2013-12-21 05:01:15.0}
INFO(com.test.analyze.TrackingItemLinkNode)resolveEntity:检查cachedEntityMap中的实体。
INFO(com.test.analyze.TrackingItemLinkNode)resolveEntity:实体为空。 查询它。
#执行实体经理在跟踪项上按ID查找
TRACE(org.hibernate.internal.SessionImpl)在时间戳上打开的会话:13906093229
DEBUG(org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl)由于自动加入检查而跳过了JTA同步注册
调试(org.hibernate.engine.transaction.internal.TransactionCoordinatorImpl)成功注册了同步
DEBUG(org.hibernate.ejb.AbstractEntityManagerImpl)寻找要加入的JTA事务
TRACE(org.hibernate.internal.SessionImpl)将刷新模式设置为:AUTO
TRACE(org.hibernate.internal.SessionImpl)将缓存模式设置为:NORMAL
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)加载实体:(com.test.db.entities.TrackingItem#component(id,partitionDate){id = 2766422,partitionDate = 2013-12-21 05:01:15.0} )
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)尝试解决:(com.test.db.entities.TrackingItem#component(id,partitionDate){id = 2766422,partitionDate = 2013-12-21 05:01:15.0 })
TRACE(org.infinispan.interceptors.InvocationContextInterceptor)使用命令GetKeyValueCommand {key = com.test.db.entities.TrackingItem#IdPartitionDateCompositePk {id = 2766422,partitionDate = 2013-12-21 05:01:15.0},flags = null调用}和InvocationContext(org.infinispan.context.impl.LocalTxInvocationContext@6ec285d3)
TRACE(org.infinispan.container.EntryFactoryImpl)是否存在于上下文中? TransientCacheEntry {key = com.test.db.entities.TrackingItem#IdPartitionDateCompositePk {id = 2766422,partitionDate = 2013-12-21 05:01:15.0},value = TransientCacheValue {maxIdle = 300000,lastUsed = 1390609322987} TransientCacheValue {value = CacheEntry(com.test.db.entities.TrackingItem)((Ljava.lang.Object; @ 73f59afe,N,2013-12-21 15:01:15.0,448,null,N,2013-12-21 05:02 :30.0,2013-12-21 13:01:15.0,463,null,null,(Ljava.lang.Object; @ 192d52c,null,180,(Ljava.lang.Object; @ 4ee93c82,WDC,(Ljava.lang .Object; @ 3283a347,null,null,MDB_45374bef @ eserver03,2014-01-24 16:02:36.0,null,3,2013-12-21 05:01:15.0,null,(Ljava.lang.Object; @ 6054a439,null,2013-12-21 13:49:14.999)}}
TRACE(org.infinispan.interceptors.CallInterceptor)执行命令:GetKeyValueCommand {key = com.test.db.entities.TrackingItem#IdPartitionDateCompositePk {id = 2766422,partitionDate = 2013-12-21 05:01:15.0},flags = null }。
#在缓存中找到跟踪项
TRACE(org.infinispan.commands.read.GetKeyValueCommand)发现值CacheEntry(com.test.db.entities.TrackingItem)(((Ljava.lang.Object; @ 73f59afe,N,2013-12-21 15:01:15.0, 448,null,N,2013-12-21 05:02:30.0,2013-12-21 13:01:15.0,463,null,null,(Ljava.lang.Object; @ 192d52c,null,180,(Ljava .lang.Object; @ 4ee93c82,WDC,(Ljava.lang.Object; @ 3283a347,null,null,MDB_45374bef @ eserver03,2014-01-24 16:02:36.0,null,3,2013-12-21 05: 01:15.0,空,(Ljava.lang.Object; @ 6054a439,空,2013-12-21 13:49:14.999)
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)转换第二级缓存条目(CacheEntry(com.test.db.entities.TrackingItem)(((Ljava.lang.Object; @ 73f59afe,N,2013-12-21 15 :01:15.0,448,null,N,2013-12-21 05:02:30.0,2013-12-21 13:01:15.0,463,null,null,(Ljava.lang.Object; @ 192d52c,null ,180,(Ljava.lang.Object; @ 4ee93c82,WDC,(Ljava.lang.Object; @ 3283a347,null,null,MDB_45374bef @ eserver03,2014-01-24 16:02:36.0,null,3,2013- 12-21 05:01:15.0,null,(Ljava.lang.Object; @ 6054a439,null,2013-12-21 13:49:14.999))进入实体:(com.test.db.entities.TrackingItem#component (id,partitionDate){id = 2766422,partitionDate = 2013-12-21 05:01:15.0})
#接着解决跟踪项的一对一关系和多对一关系。 除导航外,所有内容均在缓存中找到
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)加载实体:(com.test.db.entities.ClassificationValidValue#448)
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)尝试解决:(com.test.db.entities.ClassificationValidValue#448)
TRACE(org.infinispan.interceptors.InvocationContextInterceptor)使用命令GetKeyValueCommand {key = com.test.db.entities.ClassificationValidValue#448,flags = null}和InvocationContext调用(org.infinispan.context.impl.LocalTxInvocationContext@79517151)
TRACE(org.infinispan.transaction.TransactionTable)创建了一个新的本地事务:LocalTransaction {remoteLockedNodes = null,isMarkedForRollback = false,lockedKeys = null,backupKeyLocks = null,topologyId = 0,isFromStateTransfer = false} org.infinispan.transaction.synchronization。 SyncLocalTransaction @ 974b3
TRACE(org.infinispan.container.EntryFactoryImpl)是否存在于上下文中? 空值
TRACE(org.infinispan.container.EntryFactoryImpl)从容器TransientCacheEntry {key = com.test.db.entities.ClassificationValidValue#448,value = TransientCacheValue {maxIdle = 300000,lastUsed = 1390609323000}检索TransientCacheValue {value = CacheEntry(com.test) .db.entities.ClassificationValidValue)(INCAVG,362,1,Y,包括平均值,INCLUDE_IN_AVERAGE,n11111,2013-06-25 09:43:11.0,INCLD_AVG)}}
TRACE(org.infinispan.interceptors.CallInterceptor)执行命令:GetKeyValueCommand {key = com.test.db.entities.ClassificationValidValue#448,flags = null}。
TRACE(org.infinispan.commands.read.GetKeyValueCommand)发现值CacheEntry(com.test.db.entities.ClassificationValidValue)(INCAVG,362,1,Y,包括在平均值中,INCLUDE_IN_AVERAGE,n11111,2013-06-25 09: 43:11.0,INCLD_AVG)
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)转换第二级缓存条目(CacheEntry(com.test.db.entities.ClassificationValidValue)(INCAVG,362,1,Y,包括在平均值中,INCLUDE_IN_AVERAGE,n11111,2013- 06-25 09:43:11.0,INCLD_AVG))进入实体:(com.test.db.entities.ClassificationValidValue#448)
...截断了日志...
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)加载实体:(com.test.db.entities.Navigation#component(id,partitionDate){id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014} )
TRACE(org.hibernate.event.internal.DefaultLoadEventListener)尝试解决:(com.test.db.entities.Navigation#component(id,partitionDate){id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014 })

#Now现在解决跟踪项目的导航问题。 导航partition_dt是PST 2014年1月24日16:15:57,这是它插入到数据库中的时间戳。 该过程在太平洋标准时间2014年1月24日16:22:03,078运行

TRACE(org.infinispan.interceptors.InvocationContextInterceptor)使用命令GetKeyValueCommand {key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014}调用,flags = null }和InvocationContext(org.infinispan.context.impl.LocalTxInvocationContext@334a966b)

TRACE(org.infinispan.transaction.TransactionTable)创建了一个新的本地事务:LocalTransaction {remoteLockedNodes = null,isMarkedForRollback = false,lockedKeys = null,backupKeyLocks = null,topologyId = 0,isFromStateTransfer = false} org.infinispan.transaction.synchronization。 SyncLocalTransaction @ 974cf

TRACE(org.infinispan.container.EntryFactoryImpl)是否存在于上下文中? 空值

TRACE(org.infinispan.container.EntryFactoryImpl)从容器null检索

TRACE(org.infinispan.interceptors.CallInterceptor)执行命令:GetKeyValueCommand {key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014},flags = null }。

跟踪(org.infinispan.commands.read.GetKeyValueCommand)找不到条目

TRACE(org.infinispan.interceptors.InvocationContextInterceptor)使用命令PutKeyValueCommand {key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014},value = org调用.hibernate.cache.infinispan.access.PutFromLoadValidator $ PendingPutMap @ 7fd40ef9,flags = null,putIfAbsent = true,lifespanMillis = -1,maxIdleTimeMillis = 60000,success = true}和InvocationContext(org.infinispan.context.SingleKeyNonbx3nTxInn

TRACE(org.infinispan.util.concurrent.locks.LockManagerImpl)尝试锁定com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 24:15:57 PST 2014},且获取超时时间为10000毫

TRACE(org.infinispan.util.concurrent.locks.containers.ReentrantPerEntryLockContainer)为com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri一月24:15:57创建和获取新的锁实例PST 2014}

TRACE(org.infinispan.util.concurrent.locks.LockManagerImpl)成功获取了com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24:15:57 PST 2014}锁!

TRACE(org.infinispan.interceptors.EntryWrappingInterceptor)包装条目'com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri 1月24日16:15:57 PST 2014}}? 真正

TRACE(org.infinispan.container.EntryFactoryImpl)是否存在于上下文中? 空值

TRACE(org.infinispan.container.EntryFactoryImpl)从容器null检索

TRACE(org.infinispan.container.EntryFactoryImpl)创建新条目。

TRACE(org.infinispan.interceptors.CallInterceptor)执行命令:PutKeyValueCommand {key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014},value = org .hibernate.cache.infinispan.access.PutFromLoadValidator $ PendingPutMap @ 7fd40ef9,标志=空,putIfAbsent = true,lifespanMillis = -1,maxIdleTimeMillis = 60000,成功= true}。

TRACE(org.infinispan.interceptors.EntryWrappingInterceptor)即将提交条目ReadCommittedEntry(41a13c88){key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri 2014年1月24日15:45} ,值=org.hibernate.cache.infinispan.access.PutFromLoadValidator$PendingPutMap@7fd40ef9,oldValue = null,isCreated = true,isChanged = true,isRemoved = false,isValid = true}

TRACE(org.infinispan.container.entries.ReadCommittedEntry)更新条目(key = com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri 1月24日16:15:57 PST 2014}删除=假有效= true更改= true创建= true加载= false值=org.hibernate.cache.infinispan.access.PutFromLoadValidator$PendingPutMap@7fd40ef9)

TRACE(org.infinispan.interceptors.EntryWrappingInterceptor)返回值为null

TRACE(org.infinispan.util.concurrent.locks.LockManagerImpl)尝试解锁com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri 2014年1月24日16:15:57}

TRACE(org.infinispan.util.concurrent.locks.containers.ReentrantPerEntryLockContainer)解锁密钥com.test.db.entities.Navigation#IdPartitionDateCompositePk {id = 391438,partitionDate = Fri Jan 24 16:15:57的锁实例

#Hibernate在任何缓存中都找不到导航,它将进入数据库。

TRACE(org.hibernate.event.internal.DefaultLoadEventListener)在任何缓存中均未解析对象:(com.test.db.entities.Navigation#component(id,partitionDate){id = 391438,partitionDate = Fri 1月24日16:15: 57 PST 2014})

TRACE(org.hibernate.persister.entity.AbstractEntityPersister)正在获取实体:(com.test.db.entities.Navigation#component(id,partitionDate){id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014} )

调试(org.hibernate.loader.Loader)加载实体:(com.test.db.entities.Navigation#component(id,partitionDate){id = 391438,partitionDate = Fri Jan 24 16:15:57 PST 2014})

DEBUG(org.hibernate.engine.jdbc.internal.LogicalConnectionImpl)获得JDBC连接

调试(org.hibernate.engine.jdbc.internal.LogicalConnectionImpl)获得JDBC连接

DEBUG(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Connection)prepareStatement(选择navigation0_.NAVIGATION_ID作为NAVIGATI1_12_2_,navigation0_.PARTITION_DT作为PARTITIO2_12_2_,navigation0_.BLNKT_SLS_IP_FA_FA_FA_FA_FA_FA_FA_FA_FA_12_DE_FAB_DE_FAB_0_T_DE_IP_0_12 END_DT_TM为END6_12_2_,navigation0_.EAE_INCLUSION_STA_VLD_VAL_ID为EAE13_12_2_,navigation0_.NOTE_EXIST_FLG为NOTE7_12_2_,navigation0_.REV_BY为REV8_12_2_,navigation0_.REV_DT为REV9_12_2_,navigation0_.START_DT_TM为START10_12_2_,navigation0_.TEST_FLG为TEST11_12_2_,navigation0_.TIME_BASED_FLG为TIME12_12_2_,classifica1_.CLS_VLD_VAL_ID作为CLS1_2_0_,classifica1_.VALUE_ABBREVIATED_NM为VALUE2_2_0_,classifica1_.CLASSIFICATION_TYPE_ID为CLASSIF10_2_0_,classifica1_.VALUE_DISPLAY_SEQ_NBR为VALUE3_2_0_,classifica1_。 ÿ如REV7_2_0_,classifica1_.REV_DT如REV8_2_0_,classifica1_.VALUE_SHORT_NM如VALUE9_2_0_,classifica2_.CLASSIFICATION_TYPE_ID如CLASSIFI1_1_1_,classifica2_.DESCRIPTION_TXT如DESCRIPT2_1_1_,classifica2_.CLASSIFICATION_TYPE_NM如CLASSIFI3_1_1_,classifica2_.REV_BY如REV4_1_1_,classifica2_.REV_DT如REV5_1_1_从导航navigation0_左外在导航0_.EAE_INCLUSION_STA_VLD_VAL_ID = classifica1_.CLS_VLD_VAL_ID处向左加入CLASFN_VALID_VALUE classifica1_在classifica1_.CLASSIFICATION_TYPE_ID = classifica2_.CLASSIFICATION_TYPE_ID? 和navigation0_.PARTITION_DT =?

TRACE(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)注册语句(org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@98cee2d)

TRACE(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)注册最后一个查询语句(org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@98cee2d)

将TRACE(org.hibernate.type.descriptor.sql.BasicBinder)绑定参数(1)设置为(BIGINT)-391438

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(PreparedStatement)setLong(1,391438)

TRACE(org.hibernate.type.descriptor.sql.BasicBinder)绑定参数(2)为(TIMESTAMP)-Fri Jan 24 16:15:57 PST 2014

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(PreparedStatement)setTimestamp(2,2014-01-24 16:15:57.347)

TRACE(org.hibernate.loader.Loader)绑定(3)个参数总计

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(PreparedStatement)executeQuery()

TRACE(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)注册结果集(oracle.jdbc.driver.OracleResultSetImpl@5e781fb8)

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(ResultSet)getStatement()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(ResultSet)getStatement()

TRACE(org.hibernate.loader.Loader)处理结果集

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(ResultSet)next()

Hibernate在数据库中找不到导航0行返回了0个被水化的对象,即使它存在于数据库中也是如此。

** TRACE(org.hibernate.loader.Loader)完成的处理结果集(0行)

TRACE(org.hibernate.loader.Loader)水合对象总数:0 **

跟踪(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)释放语句(org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@98cee2d)

跟踪(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)关闭结果集(oracle.jdbc.driver.OracleResultSetImpl@5e781fb8)

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(ResultSet)close()

TRACE(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)关闭准备好的语句(org.jboss.jca.adapters.jdbc.jdk6.WrappedPreparedStatementJDK6@98cee2d)

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(语句)getMaxRows()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(语句)getQueryTimeout()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Statement)close()

TRACE(org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl)在语句执行处理之后开始(AFTER_STATEMENT)

DEBUG(org.hibernate.engine.jdbc.internal.LogicalConnectionImpl)释放JDBC连接

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Connection)isClosed()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Connection)getWarnings()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Connection)clearWarnings()

调试(jboss.jdbc.spy)java:/ SD_DATA_SOURCE(Connection)close()

DEBUG(org.hibernate.engine.jdbc.internal.LogicalConnectionImpl)已发布JDBC连接

TRACE(org.hibernate.engine.internal.StatefulPersistenceContext)初始化非延迟集合

DEBUG(org.hibernate.loader.Loader)完成实体加载

#Hibernate为跟踪项实体返回null,因为未找到导航

DEBUG(org.hibernate.ejb.AbstractEntityManagerImpl)HHH015013:返回null(按JPA规范要求),而不是抛出EntityNotFoundException,作为实体(type = com.test.db.entities.TrackingItem,id = IdPartitionDateCompositePk {id = 2766422, partitionDate = 2013-12-21 05:01:15.0})不存在

TRACE(org.hibernate.internal.SessionImpl)将缓存模式设置为:NORMAL

INFO(com.test.db.services.AbstractJPAPersistenceService)findById:对象为:null

INFO(com.test.analyze.TrackingItemLinkNode)resolveEntity:实体为:null

错误(org.jboss.as.ejb3.invocation)JBAS014134:方法公共抽象com.test.analyze.QueryResult com.test.analyze.AssociationAnalyzer.getAssociations(java.lang.Object,com.test)的组件AssociationAnalyzerImpl上的EJB调用失败.analyze.AssociationAnalyzer $ RequestType)引发com.test.analyze.AnalysisException:javax.ejb.EJBException:java.lang.NullPointerException

错误(org.jboss.as.ejb3.invocation)JBAS014134:方法public java.util.concurrent.Future com.test.processor.NavigationBlockProcessor.process(java.util.List,int,java.com)的组件NavigationBlockProcessor上的EJB调用失败util.concurrent.CountDownLatch):javax.ejb.EJBException:java.lang.NullPointerException

问题是实体的partitionDate和Database列类型之间缺少匹配。 导航的partitionDate是一个用TemporalType.TIMESTAMP注释的Date对象,其中包括毫秒。 Oracle列的类型为DATE,不包括毫秒。 Hibernate会在查询数据库导航时在包括毫秒在内的日期正确执行setTimestamp,但是执行插入操作时,数据库最多只能存储第二个时间。 之所以只有在添加了2级缓存后才可见该问题,是因为该缓存会将对象存储为毫秒,因此尝试在末尾附加毫秒来查找对象。 最简单的解决方法是将partition_dt更改为Timestamp列,并在数据库中保留毫秒。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM