Spring中pojo管理的问题

noisy007 2015-07-27 10:37:45
java类中,类的属性(field)一般应定义为final,不可变的属性可以构造不可变的类,以增加类的简单性,特别,即使类中属性只有部分不可变,也可以减少对类中可变状态的管理,也就是effective java中提到的类设计原则“将类的属性全部定义为final的,除非它们是可变的”;
然而,在实际中,使用spring管理的java类(即bean),通常都定义为私有的,但是提供了setter(即可变的方法),这样的设计是基于什么样的理由?
仅仅是因为spring的cglib实现aop必须要setter以提供注入,还是由于spring内置了对类可变性的管理呢?
困惑了好几天,希望大神不吝赐教,感激不禁。
再次感谢。

发现了,可以使用构造器注入,似乎没有定义final主要是因为项目组中人员的设计问题?
附加追问,对于一个java类,它映射oracle数据库中的一张表,那么他的id为oracle中生成的序列,问题在于,该id应该是不可变的属性,即应该定义为final,则只能在静态初始化块或者构造器中初始化;
现在要将该类的一个实例作为一条记录插入表中,但是由于序列在插入时生成(使用了mybatis的selectKey),请问有没有良好的解决方案?在初始化该类实例前先查询生成序列,再构造?还是有更优的在插入时构造该id字段?
...全文
237 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
noisy007 2015-07-27
  • 打赏
  • 举报
回复
引用 1 楼 shijing266 的回复:
ID这种字段,作用是:1、保持唯一, 2、具有业务含义 比如我们公司项目的ID或者编号,生成规则:年月日时分秒 ,总共14位,然后加 6位自增数,总体20位作为ID,又能保持唯一,又具有业务含义,你也可以尾数用6位随机数或者什么 可以看看具体生成规则 这样不用考虑那么多问题
谢谢,看了你的实现,不过对于生成的方法进行同步,对批量插入的并发性会不会不如oracle自己控制的同步序列? 另一方面,公司已经决定了使用序列,只是由于我觉得这个字段本身应该被定义为final,才遇上了这样的问题,本身使用私有的可变类型没有问题; 在使用时候使用mybatis的selectKey,在sql中直接构造序列“SELECT 'SA'||TO_CHAR(SYSDATE,'yyyymmddhh24miss')||SEQ_STORE_APP_ORDER_MASTER.Nextval FROM DUAL”也可以满足唯一性和业务含义的需求,同时交给oracle管理序列的同步,在批量插入效率上还算不错;
  • 打赏
  • 举报
回复
ID这种字段,作用是:1、保持唯一, 2、具有业务含义 比如我们公司项目的ID或者编号,生成规则:年月日时分秒 ,总共14位,然后加 6位自增数,总体20位作为ID,又能保持唯一,又具有业务含义,你也可以尾数用6位随机数或者什么 可以看看具体生成规则 这样不用考虑那么多问题
  • 打赏
  • 举报
回复
引用 4 楼 noisy007 的回复:
3Q,你们这样考虑也有道理,晚些时候我把两种方式测试一下; 另外问一下,对于类的这个id字段,你们是否定义为final,因为这块毕竟是主键,唯一标识一条记录,同时也应该是生成后就不变的。如果id可变,会不会造成并发访问时候对id的set方法进行了不一致的设置(导致数据库中出现两条除了id其他都相同的字段),这种检查id再设置的情况会不会对之后的操作有影响?
这个我们倒没设置,因为考虑到生成方式就不会重复的原则下,我没去考虑ID是否可变的情况(当然,ID肯定不能变),所以我们没加final 。 其实不设置final也不会有太大的问题,sql的写法和mybaits的写法上注意就行了。谁会没事去修改id啊 ,你的考虑有一定道理的
noisy007 2015-07-27
  • 打赏
  • 举报
回复
引用 3 楼 shijing266 的回复:
不会的,其实这样的做法还有个作用是保证业务性,比如知道是什么时候下的单,对于快速找到记录和问题有帮助的 mybatis的selectKey 也是可以的,但是我担心的是会不会给数据库造成太大的压力,我们之前考虑都是说不能给数据库太大压力,不然高并发,并不会很快,很容易让数据库事务卡死
3Q,你们这样考虑也有道理,晚些时候我把两种方式测试一下; 另外问一下,对于类的这个id字段,你们是否定义为final,因为这块毕竟是主键,唯一标识一条记录,同时也应该是生成后就不变的。如果id可变,会不会造成并发访问时候对id的set方法进行了不一致的设置(导致数据库中出现两条除了id其他都相同的字段),这种检查id再设置的情况会不会对之后的操作有影响?
  • 打赏
  • 举报
回复
不会的,其实这样的做法还有个作用是保证业务性,比如知道是什么时候下的单,对于快速找到记录和问题有帮助的 mybatis的selectKey 也是可以的,但是我担心的是会不会给数据库造成太大的压力,我们之前考虑都是说不能给数据库太大压力,不然高并发,并不会很快,很容易让数据库事务卡死

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧