十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
Go to My Oracle Blog
员工经过长期磨合与沉淀,具备了协作精神,得以通过团队的力量开发出优质的产品。成都创新互联公司坚持“专注、创新、易用”的产品理念,因为“专注所以专业、创新互联网站所以易用所以简单”。公司专注于为企业提供网站设计制作、网站设计、微信公众号开发、电商网站开发,微信平台小程序开发,软件按需规划网站等一站式互联网企业服务。刚开始使用ADF的同学基本都会问这样一个问题:
以HR schema为例:
如果列EMPLOYEE_ID的值由数据库端的Sequence负责产生,并且Sequence由Insert触发器调用,那么在中间层创建Employee的业务逻辑中当然不必考虑为此列赋值。
结果是,在ADF Faces或是JSF页面上进行创建Employee操作之后,发现EMPLOYEE_ID是一个负数,而所使用Sequence不产生负数。数据库内的值正常。
为了避免发生中间件Cache和数据库不同步的情况,需要了解Oracle专门为Sequence+Trigger这样的搭配制作的一个domain class: oracle.jbo.domain.DBSequence。
如果把Entity Object的属性:EmployeeID的类型申明为DBSequence,那么就等于告诉了ADF Model以下几点信息:
1. 在Insert的时候这个列没必要让用户赋值。
2. 在Insert前为了确保它的值在Cache中唯一性,临时赋予一个唯一的负值。
3. 在Insert时不会先到数据库中取Sequence的值,而是直接插入。这样对性能有好处。
4. 在Insert后把获得的Sequence值从数据库再刷新回Entity Object的Cache。
实际上,当你使用触发器为列发放唯一值时,不一定要通过Sequence, 都可以利用oracle.jbo.domain.DBSequence。
所以,在这里我们不因该把EmployeeID的类型设为NUMBER或是其他什么,只要修改成DBSequence就解决问题了。
Todd