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

本文通过PL/SQL Developer和MyEclipse进行Oracle数据库与Hibernate的正向和反向工程操作。首先在Oracle中创建book和owner表,然后在MyEclipse中使用Hibernate Reverse Engineering生成对应的POJO类和映射文件。需要注意的是,在设置反向工程参数时要选择正确的ID生成策略,如sequence,并根据表间关系选择合适的关联检测。完成后,需要手动调整序列生成器以匹配数据库中的序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工具: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的时候照样不会报错。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值