oracle和hibernate的正向工程和反向工程(详细图解)

来源:互联网 发布:异星工厂0.15 mac版 编辑:程序博客网 时间:2024/06/06 21:38

工具:PL/SQL Developer,数据库oracle,IDE:MyEclipse,JDK7

1. 反向工程:

首先在数据库建立表book和owner:

create table book(bid number(6) primary key,bname varchar(20) not null, -- 书名bprice number(6) not null -- 价格);create table owner(wid number(6) primary key,wname varchar(20) not null, --拥有者wbid number(6) not null -- 书本id);
为owner添加外键约束:

alter table owner add constraint fk_bid foreign key (wbid)references book(bid);
因为oracle实现id自动增长的时候需要用到序列,所以现在生产两个序列:

create sequence seq_bookminvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;create sequence seq_ownerminvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
2.在MyEclipse生产Hibernate的模版,

参考博文:oracle和Hibernate的结合  的第3步骤,引入hibernate模版

树结构图如下:


3. 打开视图MyEclipse Database Explorer,

打开方式:Window->Open Perspective->Other->MyEclipse Database Explorer

如果不知道怎么新建oracle.jdbc.driver.OracleDriver,参考博文:oracle和Hibernate的结合  的第2步骤

打开用户SCOTT的TABLE,选中刚生成的book表,右键选中Hibernate Reverse Engineering


参数如下, 在java src folder选中你的项目

勾选Create POJO<>DB Table mapping information,

并选择Add Hibernate mapping annotations to POJO(Hibernate 3.2 and abover)

勾选Update Hibernate configuration with ....


next,选择id生成策略Id Generator,选中sequence,其他不要动,需要动的情况如下:

这边要注意一下!!!

如果你的表有涉及到一对一或者多对多的关联记得勾选相关的选项,否则你还得在实体类里面自己修改注解

一对一关联的,勾选Enable one-to-one detection

多对多关联的,勾选Enable Mayn-to-Many detection

两个都有的用到的,两个都勾选。

如果你不想勾选,想手动在实体类里面自己修改,那也可以。


next, 单击一下Book,

在右边选择Id Generator:sequence,

Class name 可填可不填,不填的话就是类名和表面一致,填了就是自定义类名


最后点击Finish,在弹出的框选择yes。owner表也是这样生成的

这时候你会发现多了两个类和一个xml文件


因为用到了序列,所以这边还有两个地方需要修改一下

book.java类的 @SequenceGenerator,用上刚刚的seq_book序列

@SequenceGenerator(name = "generator",sequenceName="seq_book",allocationSize=1)//修改这条@Id@GeneratedValue(strategy = SEQUENCE, generator = "generator")@Column(name = "BID", unique = true, nullable = false, precision = 22, scale = 0)public BigDecimal getBid() {return this.bid;}
Owner.java类的@SequenceGenerator,用上刚刚的seq_owner序列

@SequenceGenerator(name = "generator",sequenceName="seq_owner",allocationSize=1)//修改这条@Id@GeneratedValue(strategy = SEQUENCE, generator = "generator")@Column(name = "WID", unique = true, nullable = false, precision = 22, scale = 0)public BigDecimal getWid() {return this.wid;}
因为用到了级联关系的一对多,所以需要添加级联注解@Cascade,否则会报错

@ManyToOne(fetch = FetchType.LAZY)@Cascade(value=CascadeType.SAVE_UPDATE)//新增这条@JoinColumn(name = "WBID", nullable = false)public Book getBook() {return this.book;}
生产测试类Test.java,跑完程序你会发现数据库查询之后会多了两条数据

一条在Book表,一条在Owner表

package Test;import org.hibernate.Session;import utils.HibernateSessionFactory;import entity.Book;import entity.Owner;public class test {public static void addOwner(Owner owner){Session session =HibernateSessionFactory.getSession();session.beginTransaction();session.save(owner);session.getTransaction().commit();HibernateSessionFactory.closeSession();System.out.println("add success");}public static void main(String[] args) {Book book = new Book("java",100);Owner owner = new Owner(book,"lwy");addOwner(owner);}}

4.正向工程。
正向工程也很简单,上面的数据都 都不变,在hibernate.cfg.xml中添加一条属性就好了,如下:

create是每次都新建表,改成update是每次都插入数据而不新建表

<property name="show_sql">true</property><property name="format_sql">true</property><property name="hbm2ddl.auto">create</property><!-- 就是这条 --><mapping class="entity.Book" /><mapping class="entity.Owner" /></session-factory>
然后把数据库表删了,运行Test.java的时候照样不会报错。




原创粉丝点击