Java

Hibernate: 设A引用了B,则删A后可能要evict(A.getB())

Hibernate: 设A引用了B,如果要先取A删A再取B删B,则删A后可能要evict(A.getB()),才能顺利删除B 否则,就会报错:a different object with the same identifier value was already associated with the session 原理是这样的:        第一步将A从数据库中取出时,它引用的B也从数据库中取出,两者同时成为持久化对象。A删除后,B是处于Session中的持久化对象       第二步中又显式地将B从数据库中取出,加上第一步中取出的B,Session里就有两个B了。这时侯如果删B,就会报上面所说的那种错误。        因此,应该在删除A后立即将它引用了的B从Session中清除掉。即:        A   =  Session.load(A);        Session.delete(A);        Session.evict(A.getB());        Session.delete(B); =============================================== 注意:evict()并不会级联,除非设置了相应的cascade 也就是说,如果B引用了C, evict(B)时不会自动evict(C) 看官方文档: This operation cascades to associated instances if the association is mapped with cascade="all" or cascade="all-delete-orphan". 

多线程学习笔记

1.局部变量永远不会被多个线程共同访问。因为:If two threads happen to execute the same method, each thread   gets a separate copy of the local variables of that method. 2.成员变量可能被多个线程共同访问,但是Java threads cannot arbitrarily access each other’s data objects:   they need permission to access the objects, and one thread needs to pass the object reference to the   other thread. 3.用设置flag的方法来终止线程 …

多线程学习笔记 Read More »

我常在Spring Controller 中使用的 toSv()

把successView当作http parameter传进来,可以方便重用Controller ==========================================================            private ModelAndView toSv(HttpServletRequest request, HttpServletResponse response, Map model) { String sv = request.getParameter("sv"); return new ModelAndView(sv, model); }

设计 程序文件的组织结构 时要注意方便部署

1.应该把所有运行时配置(如轮询时间,而spring的接口注入则属于开发时配置)都集中到同一个根目录里,这样可以方便部署。一个Release中,有一部分是跟运行的环境有关的(如数据库地址、日志文件名等),有的是无关的(class文件,jsp文件,spring的接口注入等),我们把有关的部分集中一个根目录里,与无关的部分彻底分离,这样在部署时,无关的部分痛痛快快地用脚本做一次全量复制就行了 2. 如果一份程序的多个副本部署在多台机器上,除了要把运行环境相关部分和无关部分分开,对相关部分,也要区分各程序相同的部分和各程序不同的部分,如数据库的配置就各程序相同的,而日志文件路径和各采集器的配置就各不相同。还有一种配置,只在一个或多个程序中有意义并在这些程序中相同,但在其他程序中用不上,也可以视为各程序相同部分。通过这种区分,在部署时,对相同部分只须设定一次,然后用脚本复制多份即可