我在使用postgre sql的項目中使用mybatis版本3.4.0。有一個ID列 是串行類型(自動增加主鍵列)。如何控制mybatis的localCache?
我寫的映射器的generateId方法獲取序列值:
映射器接口:
public interface DemoTableNameMapper {
long generateId();
...
mapper.xml:
<select id="generateId" resultType="long">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
</select>
但是當我打電話映射器的generateId方法兩次想要得到兩個ID值,我找到我得到了相同的值!
然後我追溯到mybatis的源代碼,我發現它是mybatis的localCache返回以前生成的ID值。
爲了解決這個問題,我改變了我的generate的聲明和實現。
接口:
public interface DemoTableNameMapper {
/**
* 產生新的主表的ID
* 注:因在一次事務中需多次調用,需通過混淆參數來避免命中 mybatis 的 localCache
* @return
*/
long generateId(@Param("dummyid") String dummyid);
...
mapper.xml:
<select id="generateId" resultType="long">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
WHERE #{dummyid}=#{dummyid}
</select>
我的問題是: 有沒有更好的辦法了MyBatis的localCache互動?
我改變mapper.xml這樣:
<select id="generateId" resultType="long" useCache="false" flushCache="true">
SELECT nextval('"public".demo_table_name_id_seq'::regclass)
</select>
它的工作!
謝謝。我的聲譽太低,所以我不能和你達成一致。抱歉! – yinmingjuncn
沒問題。沒關係。 –