java连接docker中的oracle问题解决方案

         
          在学习spring-boot,看的书籍为汪云飞《java EE开发的颠覆者  spring boot 实战》,但是书中有好多错误,人嘛,难免会粗心出错,接下来我讲的这个错误出现在第8章spring boot 的数据访问(即spring data jpa),我用的是IntelliJ IDEA 2016.3.4版本、springboot用的是1.5.2版本,docker用的是1.12.6版本,linux服务器版本为centos7.3.1611,也许不是作者的粗心失误,也许是当时作者用的是springboot较低版本,现在我用的是1.5.2,情况发生变化了吧,还有就是,书中感觉略过了一些步骤,让初学springboot的人按照书中的例子运行会报各种错,这可把人急坏了


        书中8.2.3实战部分,因为书中例子用的是oracle-xe-11g(作者说oracle是目前使用最广泛的,这点我不太认同,我觉得应该是mysql),我也跟着例子走,当oracle容器运行之后,就要插入数据了,而spring boot的方便之处就是他提供了一个初始化数据的功能:放置在类路径下的schema.sql文件会自动用来初始化表结构;放置在类路径下的data.sql文件会自动用来填充表数据(这一点在书中也有说明),但是在实战时作者只说在src/main/resources下新建一个data.sql,这个只能用来插入数据,当你运行时就会报错,错误提示表不存在table ‘person’ does not exist


1.疑问一表不存在

           不过作者在书中此部分之前确实有一句话是这么说的:假定数据库中有一张表名为person,字段有id(NUMBER)等等,可能是他提前建好了表吧,没说清楚,也许是他没建表,本来要在src/main/resources下面在新建一个schema.sql用来建表的,但是忘了,都有可能,不管怎么说,我们在在src/main/resources下面在新建一个schema.sql,内容如下:

CREATE TABLESPACE testtbs01 DATAFILE 'test_data.dbf' SIZE 20M;
create sequence hibernate_sequence increment by 1 start with 1 maxvalue 999999999;
CREATE TABLE person (id  NUMBER(5) PRIMARY KEY,name  VARCHAR2(15) NOT NULL,age NUMBER(5),address VARCHAR2(15)) TABLESPACE testtbs01;

      解释:第一行为创建表空间,oracle中创建表必须有表空间;(注意:创建表空间时,DATAFILE
‘test_data.dbf'为指定表空间的存储位置,因为目前我的oracle是运行在linux上的docker容器中,他的默认存储位置在./u01/app/oracle/product/11.2.0/xe/dbs/ ,所以你前面不要再加任何路径,就直接写DATAFILE ‘xxx.dbf',

当然你可以登陆容器(命令为#docker exec -it container-id bash),然后到相应的目录下管理表空间文件(登陆以后,容器里面就相当于一个小型的linux系统,这时输入#sqlplus / as sysdba 回车会进入oracle控制台,然后oracle命令行中,输入:

select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts# = t2.ts#;就可以看所有表空间的位置了,参考这个地址http://jingyan.baidu.com/article/414eccf67a35a96b431f0ac2.html)


                 第二行创建序列,因为表主键使用到了自增序列;

                 第三行创建表语句

    
      道歉:我要向作者和网友道歉,我在做本书后面的练习时,又遇到了这个问题(表不存在),这个并不是作者忘了建表,而是在application.properties文件中配置了

spring.jpa.hibernate.ddl-auto=update

书中说这句代码会为我们自动生成实体类对应的表,奇怪的是,我当时也加了这句代码,为什么就不行呢?后面练习其他项目时又按照这个来做,又可以了,好奇怪啊,别忘了在实体类上使用@Entity注解,在id属性上使用@Id@GenerateValue注解,当然如果你加了这句代码也不行的话,你就按照我上面说的在在src/main/resources下面在新建一个schema.sql,里面写入建表语句;还有一个我弄错了,作者并不是忘了创建表空间,而是(在创建表时,如果不指定表空间)默认表空间为SYSTEM


2.疑问二:包名错乱

          作者让我们新建一个springboot项目,包名为com.wisely.ch8_2,那么对应的启动类Ch82Application.java就在com.wisely.ch8_2包下,但是你看他的Person类在com.wisely.domain包下,PersonRepository接口在com.wisely.dao包下,DataController在com.wisely.web包下,你一运行,然后在浏览器访问,页面显示Whitelabel Error Page(这种错误就是典型的路径映射找不到),网上搜了半天,找到了解决办法,你的启动类Ch82Application.java就在com.wisely.ch8_2包下,那么你的web、dao、domain包也必须在com.wisely.ch8_2包下,我全部移进去com.wisely.ch8_2包下,就可以正常访问了(参见这个博客http://blog.csdn.net/u014788227/article/details/53670112)


3.疑问三:书中在application.properties中没有配置数据库方言,否则启动会报错dialect not set

         在文件里添加下面一行

spring.jpa.database=oracle


4.疑问四

         spring data jpa支持用jpa的NameQuery来定义查询方法,即在类名上使用@NameQuery注解,这个注解有两个包,分别为

org.hibernate.annotations.NamedQuery
javax.persistence.NamedQuery
我不知道选哪一个,有什么区别,两种都试了,都可以用,书中实在person类上使用的这个注解,但就是没写导的是哪个包,奇了怪了,难道他能在不到包的情况下直接引用???


       另外oracle在linux上docker中作为服务端,你要在windows端控制必须要有一个客户端,以方便管理,我用的是navicat连接,打开后数据库结构好不习惯(SYSTEM和模式)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值