JPA概念解析:CascadeType(各种级联操作)

【在一切开始之前,我要先告诉大家:慎用级联关系,不要随便给all权限操作。应该根据业务需求选择所需的级联关系。否则可能酿成大祸。切记】 在理解不足时,慎用@OneToOne @OneToMany @ManyToOne @ManyToMany这几个注解。都说Jpa复杂,果然名不虚传。不恰当的使用。会带来各种问题。切记!!! CascadeType.PERSIST官方文档的说明:Cascade persist operation看到网上很多博客对这一枚举值的解释是:级联持久化(保存)操作(持久保存拥有方实体时,也会持久保存该实体的所有相关数据。) 可以看到,我们在上面的代码中给了Student对Course进行级联保存(cascade=CascadeType.PERSIST)的权限。此时,若Student实体持有的Course实体在数据库中不存在时,保存该Student时,系统将自动在Course实体对应的数据库中保存这条Course数据。而如果没有这个权限,则无法保存该Course数据。 CascadeType.REMOVECascade remove operation,级联删除操作。删除当前实体时,与它有映射关系的实体也会跟着被删除。 CascadeType.MERGECascade merge operation,级联更新(合并)操作 CascadeType.DETACHCascade detach operation,级联脱管/游离操作。如果你要删除一个实体,但是它有外键无法删除,你就需要这个级联权限了。它会撤销所有相关的外键关联。 CascadeType.REFRESHCascade refresh operation,级联刷新操作。会重新查询数据库里的最新数据。类似级联查询。 CascadeType.ALLCascade all operations,清晰明确,拥有以上所有级联操作权限。

sudo -i 配置免密码

一、登陆系统 二、su root 输入秘密后vi /etc/sudoers,按照root账户的形式,在下面添加一行 ## Allow root to run any commands anywhere root ALL=(ALL) ALL admin ALL=(ALL) ALL 保存之后:wq! (文件为只读,强制保存)退出 exit 三、进入自己的用户输入sudo uname,根据提示输入一下自己的密码就OK了,可以再试试sudo -i 四、如果不想每次退出之后都要再输入一次,配置文件可以写成这样 admin ALL=(ALL) NOPASSWD:ALL 保存之后,可以退出root然后退出系统,再进入系统,就不用输入密码了

Idea Jrebel

jrebel插件当前有几个问题 debug很容易卡住 使用jrebel启动的项目。无法访问项目中的部分资源(比如运行中生成的excel文件) 使用jrebel启动的项目。前端部分请求会报网络请求错误,net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK) 已知eladmin前端及接口文档无法访问是由于jrebel的原因。正常debug启动无问题 第一点最为重要。是否要继续使用存疑

计算机原码,反码,补码

机器数 一个数在计算机中的表现形式叫做机器数,这个数有正负之分,在计算机中用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。 例如正数7,在计算机中用一个8位的二进制数来表示,是00000111,而负数-7,则用10000111表示,这里的00000111和10000111是机器数 真数 计算机中的机器数对应的真实的值就是真数,对最高位(符号位)后面的二进制数转换成10进制,并根据最高位来确定这个数的正负。对于上面的00000111和10000111来说,对最高位后面的二进制数转换成10进制是7,在结合最高位的值,得出对应的真数分别是7和-7 原码 用第一位表示符号,其余位表示值。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111_1111 , 0111_1111] 即 [-127 , 127] ,原码是容易被人脑所理解的表达方式 反码 正数的补码反码是其本身,负数的反码是符号位保持不变,其余位取反。例如正数1的原码是[0000_0001],它的反码是是其本身 [0000_0001],-1的原码是[1000_0001],其反码是[1111_1110] 补码 正数的补码是其本身,负数的补码是在其反码的基础上+1,例如正数1的原码是[0000_0001],他的补码是其本身[0000_0001], -1的补码是[1111_1111] 有了原码为什么要使用反码和补码 因为人脑可以知道第一位是符号位,可以根据符号位对真值的绝对值进行加减乘除,但是对于计算机来说,加减乘除是最最最基本的运算,要设计的尽量简单,计算机辨别符号位会让计算机的设计电路变得很复杂,于是人们想出了让符号位也参与到运算上来。减去一个数,等于加上他的负数。 使用原码参数运算的缺陷 从上面的原码表中可以看见左边每增加一个二进制单位对应的真数是递减的,而右边每增加一个二进制单位对应的真数是递增的,所以对于原码来说,能满足正数的加法,但无法满足负数的加法 2+1 = [0000_0010]原+[0000_0001]原=[0000_0011]原 = 3 1+-1=[0000_00001]原+[1000_0001]原=[1000_0010]原=-2 为了满足负数对加法的需求,就必须让负数与他对应的二进制码是同步递增或者同步递减 于是就通过符号位不变,其余位取反来满足这个同步递增或者递减的要求,由于正数本来就满足它本身的加法,所以不需要做任何改变。这就是反码的定义由来。 从上图的反码表中可以看到在运算不跨过0的时候,正负数的加法已经能满足要求 -2+1=[1111_1101]反+[0000_0001]反=[1111_1110]反=-1 127+1=[1000_0000]反=-127=128 加法算出来是128,由于128超过最大值,余1,所以取最小值开始的第一位,也就是 最小值-127,但是这里有个不合理的地方,就是[1111_1111]和[0000_0000]都表示0,这导致在实际计算中每当跨过0一次,就有一个单位的误差 -1+2=[1111_1110]反+[0000_0010]反=[0000_0000]反=0 要解决这个问题就必须让反码中的[1111_1111]和[0000_0000]合并, 由于[1111_1111]+[0000_0001]=[0000_0000],所以在负数反码的基础上+1就可以解决反码中跨0的误差问题,同时不会对负数与它对应的二进制反码的同步递增产生影响,所以在反码的基础上+1就完美的解决了符号参与预算的问题,这就是补码为什么是在负数反码的基础上+1的由来。 从上面的图中发现还有一个[1000_0000]的二进制没有对应任何真数,于是就规定了这个数的真数是-128 所以补码的表示范围是[-128~127] ,这样一来256个二进制正好表示256个整数,在实际二进制的运算中超过范围其实就是对256的取余预算(x+128)mod 256 – 128。

Java多线程通信工具类

转自:深入浅出Java多线程http://concurrent.redspider.group/article/03/17.html JDK中提供了一些工具类以供开发者使用。这样的话我们在遇到一些常见的应用场景时就可以使用这些工具类,而不用自己再重复造轮子了。 它们都在java.util.concurrent包下。先总体概括一下都有哪些工具类,它们有什么作用,然后再分别介绍它们的主要使用方法和原理。 类 作用 Semaphore 限制线程的数量 Exchanger 两个线程交换数据 CountDownLatch 线程等待直到计数器减为0时开始工作 CyclicBarrier 作用跟CountDownLatch类似,但是可以重复使用 Phaser 增强的CyclicBarrier 下面分别介绍这几个类。 17.1 Semaphore 17.1.1 Semaphore介绍 Semaphore翻译过来是信号的意思。顾名思义,这个工具类提供的功能就是多个线程彼此“打信号”。而这个“信号”是一个int类型的数据,也可以看成是一种“资源”。 可以在构造函数中传入初始资源总数,以及是否使用“公平”的同步器。默认情况下,是非公平的。 // 默认情况下使用非公平public Semaphore(int permits) {    sync = new NonfairSync(permits);}​public Semaphore(int permits, boolean fair) {    sync = fair ? new FairSync(permits) : new NonfairSync(permits);} 最主要的方法是acquire方法和release方法。acquire()方法会申请一个permit,而release方法会释放一个permit。当然,你也可以申请多个acquire(int permits)或者释放多个release(int permits)。 每次acquire,permits就会减少一个或者多个。如果减少到了0,再有其他线程来acquire,那就要阻塞这个线程直到有其它线程release permit为止。 17.1.2 Semaphore案例 Semaphore往往用于资源有限的场景中,去限制线程的数量。举个例子,我想限制同时只能有3个线程在工作: […]

Java的位运算符——与(&)、非(~)、或(|)、异或(^)

位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算。下面详细介绍每个位运算符。 1.与运算符 与运算符用符号“&”表示,其使用规律如下: 两个操作数中位都为1,结果才为1,否则结果为0,例如下面的程序段。 public class data13 { public static void main(String[] args) { int a=129; int b=128; System.out.println(“a 和b 与的结果是:”+(a&b)); } } 运行结果 a 和b 与的结果是:128 下面分析这个程序: “a”的值是129,转换成二进制就是10000001,而“b”的值是128,转换成二进制就是10000000。根据与运算符的运算规律,只有两个位都是1,结果才是1,可以知道结果就是10000000,即128。 2.或运算符 或运算符用符号“|”表示,其运算规律如下: 两个位只要有一个为1,那么结果就是1,否则就为0,下面看一个简单的例子。 public class data14 { public static void main(String[] args) { int a=129; int b=128; System.out.println(“a 和b 或的结果是:”+(a|b)); } } 运行结果 a 和b 或的结果是:129 […]

正在更新 Office,请稍候”,然后弹出一个错误框”应用程序无法正常启动(0xc0000142)。请单击”确定”关闭应用程序。”

这是Office2019或office365的小毛病。 解决方法: 开始——运行,输入services.msc——找到将Microsoft Office即点即用服务——禁用——设为自动——重新启动 之后重新启动即可。这种一般时office后台自动更新时发生了关机等中断

更改yum 源

例如执行yum update,经常报错“Cound not resolve host: xxxxx”,一般都是yum源是使用的国外镜像,国内访问很不好。这时可以将源手动替换为国内的清华大学源,或者阿里云源之类的。 详细使用方法可以参考https://mirrors.tuna.tsinghua.edu.cn/help/centos/,镜像站使用帮助,选择自己的版本即可。 CentOS 7 下面贴出CentOS 7版本下,清华源的配置 1 # CentOS-Base.repo 2 # 3 # The mirror system uses the connecting IP address of the client and the 4 # update status of each mirror to pick mirrors that are updated to and 5 # geographically close to the client. You should […]

lWoHvYe 无悔,专一