顯示具有 hibernate 標籤的文章。 顯示所有文章
顯示具有 hibernate 標籤的文章。 顯示所有文章

2025/2/18

spring boot Operator SIMPLE_PROPERTY 錯誤

 錯誤訊息範例如下:

Caused by: java.lang.IllegalStateException: Operator SIMPLE_PROPERTY on searchDto requires a scalar argument, found class com.fasterxml.jackson.databind.JsonNode in method public abstract se.company.search.Search se.company.search.SearchRepository.findFirstBySearchDto(com.fasterxml.jackson.databind.JsonNode).
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.throwExceptionOnArgumentMismatch(PartTreeJpaQuery.java:171)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.validate(PartTreeJpaQuery.java:147)
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:90)
    ... 73 common frames omitted.
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.throwExceptionOnArgumentMismatch(PartTreeJpaQuery.java:171) ~[spring-data-jpa-2.2.4.RELEASE.jar:2.2.4.RELEASE]
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.validate(PartTreeJpaQuery.java:147) ~[spring-data-jpa-2.2.4.RELEASE.jar:2.2.4.RELEASE]
    at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:90) ~[spring-data-jpa-2.2.4.RELEASE.jar:2.2.4.RELEASE]
    ... 74 common frames omitted


 

說明:

網路上找的都是要把結尾加上In...等解決方式

但是我不需要由JPA來幫我mapping,我會自己自定義查詢的method

 解決方式:

    正確: import org.springframework.data.jpa.repository.Query;

    錯誤:import org.springframework.data.jdbc.repository.query.Query;

原因:

  我POM.xml裡面 有引入

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-jdbc</artifactId>

</dependency>

 

 

 

 

2015/12/18

EF framework LIKE Hibernate SaveOrUpdate()


 from:
http://stackoverflow.com/questions/7552433/what-is-the-equivalent-for-hibenate-saveorupdate-in-entity-framework
果然是stackflow,馬上找到

There is no equivalent. You really have to write it like:
using (DataContext context = new DataContext())
{
    context.Task.Attach(task);
    if (task.ID == 0)
    {
         context.ObjectStateManager.ChangeObjectState(task, System.Data.EntityState.Added);
    }
    else
    {
         context.ObjectStateManager.ChangeObjectState(task, System.Data.EntityState.Modified);
    }

    context.SaveChanges();
 }

2015/8/5

task java:26503 blocked for more than 120 seconds


案發原因:
JAVA process一直活著,但莫名其妙無法服務,檢查/var/log/messages,發現有下面訊息:
Jul 31 06:25:19 localhost kernel: INFO: task java:6498 blocked for more than 120 seconds.
Jul 31 06:25:19 localhost kernel:      Not tainted 2.6.32-504.el6.x86_64 #1
Jul 31 06:25:19 localhost kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Jul 31 06:25:19 localhost kernel: java          D 0000000000000000     0  6498  26501 0x00000080
Jul 31 06:25:19 localhost kernel: ffff88003cd6be08 0000000000000082 ffff88003cd6bdc8 ffff88003cd6bdc8
Jul 31 06:25:19 localhost kernel: ffff88003cd6bdc8 ffff88000000070d 0000000000000001 00000009ffffffff
Jul 31 06:25:19 localhost kernel: ffff880000000000 ffffffffa0121e08 ffff88007c99d058 ffff88003cd6bfd8
Jul 31 06:25:19 localhost kernel: Call Trace:
Jul 31 06:25:19 localhost kernel: [<ffffffffa0121e08>] ? ext4_file_write+0x58/0x190 [ext4]
Jul 31 06:25:19 localhost kernel: [<ffffffff81236ba1>] ? file_has_perm+0xd1/0xe0
Jul 31 06:25:19 localhost kernel: [<ffffffff8152cae5>] rwsem_down_failed_common+0x95/0x1d0
Jul 31 06:25:19 localhost kernel: [<ffffffff8152cc43>] rwsem_down_write_failed+0x23/0x30
Jul 31 06:25:19 localhost kernel: [<ffffffff812989f3>] call_rwsem_down_write_failed+0x13/0x20
Jul 31 06:25:19 localhost kernel: [<ffffffff8152c142>] ? down_write+0x32/0x40
Jul 31 06:25:19 localhost kernel: [<ffffffff8114545c>] sys_mmap_pgoff+0x5c/0x2d0
Jul 31 06:25:19 localhost kernel: [<ffffffff81012499>] sys_mmap+0x29/0x30
Jul 31 06:25:19 localhost kernel: [<ffffffff8100b072>] system_call_fastpath+0x16/0x1b
google大神告訴我:
http://www.blackmoreops.com/2014/09/22/linux-kernel-panic-issue-fix-hung_task_timeout_secs-blocked-120-seconds-problem/

Make it permanent

When the server seemed more stable and no Kernel/Swap/Memory Panic for a week, I edited /etc/sysctl.conf file to make these permanent after reboot.
someuser@servercore [/home/someuser]$ sudo vi /etc/sysctl.conf

vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
 reboot,繼續觀察是否解決

補充:
另外搜尋到關鍵字:hung_task_timeout_secs
查詢到相關資訊:

http://blog.uouo123.com/post/700.html

解決辦法:
按照告警裡的提示將該提醒disable
echo 0 > /proc/sys/kernel/hung_task_timeout_secs

意思就是:
告知是linux會設置40%的可用內存用來做系統cache,當flush數據時這40%內存中的數據由於和IO同步問題導致超時(120s),所將40%減小到10%,避免超時。






2015/5/11

關於hibernate查詢--



來源:
http://www.cnblogs.com/balaamwe/archive/2012/03/13/2393912.html
http://shilinfeng.cool.blog.163.com/blog/static/1183214652013528113441283/

起因:
使用hibernate查詢一個TABLE,此table的資料,由另外一組hibernate來負責
剛啟動時正常,但是一段時間之後,就一直停留在固定一筆欄位
一開始推測:browser自己建立cache,所以要強制F5
後來還是一樣狀況
開始追查,推測是hibernate取出資料有錯
查詢到部分網頁,可解決方式有二:
A.每次重新取得一個session
B.使用flush

摘錄如下:

A.
問題描述:這個最開始查詢時是讀取數據庫的,但是在頁面如果對數據進行刪改後,再來查詢就會出現結果錯誤!
原因:查出的數據會放入到緩存中,而我插入和刪除數據用的是存儲過程做的,因為存儲過程會直接將數據插入到數據庫中而不會放入到緩存中,所以當再次查詢數據時由於是獲取的當前的session,就會默認從緩存中查找數據,就導致了查出的數據會和數據庫的數據不對應!
結局辦法就是重新打開一個session,就正常了!

HibernateUtil.getSessionFactory().openSession();

 B.
Hibernate會儘量將與數據庫的操作延遲,直到必須要與數據庫進行交互,例如save方法一般會在提交時才真正執行,最終在提交時會以批處理的方式與數據庫進行交互,以提高效率。
而將操作延遲,就是利用緩存,將最後要處理的操作放到緩存中。
通過設置session.setFlushMode(),可以精確控制Hibernate的FlushMode.
(1) FlushMode.AUTO:Hibernate判斷對象屬性有沒有改變,如果被更改成為髒數據,則在一個查詢語句前將更新此改動以保證數據庫的同步。這也是Hibernate的默認清理模式。
(2) FlushMode.COMMIT:在事務結束之前清理session的緩存。這樣有可能導致查出髒數據
(3) FlushMode.NEVER:除非強制調用Session.flush(),否則永遠不清理Session。相當於將數據庫設置為一個只讀的數據庫。
       【如果此時進行數據的寫入操作,會發生錯誤】
(4) FlushMode.ALWAYS:在每一個查詢數據之前都調用Session.flush()。很顯然這種效率很低。 

筆記下來,以後好查詢


手機QQ禁用NFC

一圖解千言萬語 應用程式權限:透過NFC起動