工具: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_book
minvalue 1 maxvalue 999999999 start with 1 increment by 1 cache 20;
create sequence seq_owner
minvalue 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的时候照样不会报错。