Java ORM框架FastmyBatis踩坑
-
問題:使用了FastmyBatis的saveOrUpdate方法,明明設置了主鍵的值且表中存在,但是依然執行insert操作。導致Duplicate PK。
-
原因:使用了其他第三方包的注解指定表的主鍵,沒有按照FastmyBatis本身指定主鍵的方式去做。
所以執行saveOrUpdate方法時找不到主鍵,所以日志也看不到根據主鍵查數據是否存在的這條sql日志,只看到insert日志。修改完之后,saveOrUpdate方法無論是insert還是update之前都會先根據主鍵(默認)去查表,看看這條數據是否存在。
問題代碼:
使用了第三方包@Id注解去指定主鍵
import com.gitee.fastmybatis.annotation.Table;
import javax.persistence.GeneratedValue;
import javax.persistence.Id; //或者換成import org.springframework.data.annotation.Id;
import javax.persistence.Column;@Table(name = "xxxtable")
public class xxxEntity{@GeneratedValue(strategy = GenerationType.AUTO)@Id@Column(name = "xxx_id")private Long leadId;
}
解決方式
使用這個框架的指定主鍵和字段的方式是:
import com.gitee.fastmybatis.annotation.Pk;
import com.gitee.fastmybatis.annotation.PkStrategy;
import com.gitee.fastmybatis.annotation.Table;
import com.gitee.fastmybatis.annotation.Column;@Table(name = "xxxtable", pk = @Pk(name = "xxx_id", strategy = PkStrategy.NONE))
public class xxxEntity{@Column(name = "xxx_id")private Long xxxId;
}
感悟
Java這些同名的第三方類真是太多了,一不小心選錯的話,如果編譯還通過了,運行時就可能導致意想不到的bug!