persistence.xml和类装载

部署时报这个错误:

java.lang.IllegalStateException: PersistenceProvider [oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider@1927691] did not return an EntityManagerFactory for name ‘mypu’

通常这样的问题是由于没有找到META-INF/persistence.xml或者是名字写错了。但是这里的配置并没有错,而且使用本地eclipse环境同样适用oc4j也是可以部署成功的。尝试把persistence.xml放到war把下的meta-inf目录,不成功。(原本这个文件是放到web-inf/lib下的一个jar里)
后来发现将war打包到ear再去发布就成功了。由此发现了oc4j对于war和ear不同的类装载策略。
关于jee的类装载层次可以看这篇文章

-还有一种可能是toplink-essential的版本问题,这个是好使的:2.0-b41-beta2 (03/30/2007)

—-这个问题解决了.原因是使用的应用服务器oc4j在部署是会记住上一次部署时的war文件名(它会根据这个文件名创建一个临时文件夹),而在下次部署时,如果war的文件名变掉,则会还去找原来的那个文件夹!!所以部署前要把oc4j缓存清除并重启!

mini进销存软件

家里有人要开店,帮忙去看了几个进销存软件,各有特色。
管家婆是做的比较久貌似也比较有名,不过安装了一下觉得太复杂,不适合维护。三易通服装进销存界面比较简单,也不复杂,唯一的缺点是只有单机版,不过用在店铺小,对分布没有要求是可以考虑,也不贵600多,还打了个客服电话 – 那边一听就是一程序员,而且号称是终身维护的哦,免费升级。据他说以后会出网络版的 – 不过不会通过免费升级,而是另一个产品。呵呵。
最后还看了一个是生财宝,从专业的角度来说,这个产品是最先进的了,但也是操作最复杂的,对非专业的店主来说还是挺有挑战的。可以在任何地方登录,还可以通过短信来定义各种通知 – 比如员工交接班这样的东西,甚至可以远程获取监控视频。目前比较倾向于这个。
还看了一个什么赛管家,第一眼就感觉回到了VB时代(10年前),都没怎么用。

其实根据我和这位亲戚沟通,她的需求其实非常非常简单。
1.进货 – 直接输入名称,对应各种尺码和数量,进货价,销售价,最低折扣,图片附件
2.销售 – 直接根据编号调出物品信息,记录销售信息(销售价),更新库存
3.库存 – 可以查询货品及库存数量,销售记录

最多最多,还有一个会员管理,和销售数据有对应。哪里有这样的软件应用呢?

junit单元测试基类

自己写了一个用来简化代码的单元测试基类,省的每次都要初始化spring和获取相应的bean对象。

public class BaseTest {
    static ApplicationContext ac = null;
    static {
        ac = new ClassPathXmlApplicationContext(
                new String[] {"/test-*.xml"});
    }
    protected C target;
    public BaseTest() {
    }
    @Before
    public void setUp(){
        Class targetClz = (Class) ((ParameterizedType) getClass()
                .getGenericSuperclass()).getActualTypeArguments()[0];
        String targetClzName = targetClz.getSimpleName();
        String arg0 = targetClzName.substring(0,1).toLowerCase()+targetClzName.substring(1);
        target = (C)ac.getBean(arg0);
    }
}

这样,在测试用例类里就比较简单了:

public class XXXDaoImplTest extends BaseTest{
    @Test
    public void testFindAll() {
        List l = target.findAll();
        assertTrue(l.size()>0);
    }
}

这样做的前提是一定要遵循命名规则 – bean的id是相应类的名的首字母小写,比如 AbcDao的实现是AbcDaoImpl,声明测试类时要给出AbcDao作为泛型参数。当然BaseTest的内容很简单,如果需要定制也很方便。

java获取昨天的日期

如果不小心还是会栽跟头,看到网上有的人只是roll(Calendar.Date,-1)就了事了。要么就是判断日,月写一大堆。
其实最简单的应该是:

GregorianCalendar cal = new GregorianCalendar();
if(cal.get(Calendar.MONTH)==0 && cal.get(Calendar.DAY_OF_YEAR)==1){
     cal.roll(Calendar.YEAR, -1);
}
cal.roll(Calendar.DAY_OF_YEAR, -1);

不知道是不是最简单的