设为首页 收藏本站
查看: 592|回复: 0

[经验分享] Hibernate one -to -one mapping for Oracle auto-increment key

[复制链接]
YunVN网友  发表于 2016-8-15 06:09:30 |阅读模式
1. DB table create
 
The parent table
 

create table stock (
stock_id number(10)  not null,
stock_code varchar2(10) not null,
stock_name varchar2(10) not null,
primary key (stock_id)
);
  the child table
 
 

create table stock_detail(
stock_id number(10) not null,
comp_name varchar2(100) not null,
comp_desc varchar2(100) not null,
remark_desc varchar2(100) not null,
listed_date date not null,
primary key (stock_id),
foreign key(stock_id) references stock(stock_id)
)
 below is create the sequence for the parent table for the primary key
 
 

create sequence stock_seq start with 1 increment by 1 nomaxvalue;
 below trigger auto-update the primary key for the parent table
 
 

create or replace trigger stock_trigger
before insert on stock
for each row
begin
select stock_seq.nextval into:new.stock_id from dual;
end;
/   
 below is test for above code, don't need in the demo, u can ignore
 
 

insert into stock(stock_code,stock_name) values('112','112_com')
insert into stock_detail(stock_id,comp_name,comp_desc,remark_desc,listed_date)
values(4,'111','111','111',to_date('2013-04-05','yyyy-mm-dd'))
desc stock;
desc stock_detail;
select * from stock;   
select * from stock_detail;  
create or replace procedure proc_dropifexist(
p_table in varchar2
) is
v_count number(10);
begin
select count(*)
into v_count
from user_tables
where table_name = upper(p_table);
if v_count > 0 then
execute immediate 'drop table ' || p_table ||' purge';
end if;
end proc_dropifexist;         
exec proc_dropifexist('stock');

 
 
2. pojo & sessionFactory
 
1. Stock:
 

public class Stock implements java.io.Serializable {
private int stockId;
private String stockCode;
private String stockName;
private StockDetail stockDetail;
...
//ignore the constructor & getter/setter
}
 2. StockDetail:
 
 

public class StockDetail implements java.io.Serializable {
private int stockId;
private Stock stock;
private String compName;
private String compDesc;
private String remarkDesc;
private Date listedDate;
...
//ingore the constructor & getter/setter
}
 
3. SesstionFactory get via HibernateUtil

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static final SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
try {
//create SessionFactory from hibernate.cfg.xml
return new Configuration().configure().buildSessionFactory();
} catch(Throwable ex) {
System.err.println("Initial SessionFactory creation failed: " + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static void shutdown() {
getSessionFactory().close();
}
}

 
4. xml config file:
 
Stock.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="net.codercn.module.Stock" table="stock">
<id name="stockId" type="int">
<column name="stock_id"/>
<generator class="sequence">
<param name="sequence">stock_seq</param>
</generator>
</id>
<property name="stockCode" type="string">
<column name="stock_code" length="10" not-null="true"/>
</property>
<property name="stockName" type="string">
<column name="stock_name" length="10" not-null="true"/>
</property>
<one-to-one name="stockDetail" class="net.codercn.module.StockDetail" cascade="save-update"></one-to-one>
</class>
</hibernate-mapping>


StockDetail.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="net.codercn.module.StockDetail" table="stock_detail">
<id name="stockId" type="int">
<column name="stock_id"/>
<generator class="foreign">
<param name="property">stock</param>
</generator>
</id>
<one-to-one name="stock" class="net.codercn.module.Stock" constrained="true"></one-to-one>
<property name="compName" type="string">
<column name="comp_name" length="100" not-null="true"/>
</property>
<property name="compDesc" type="string">
<column name="comp_desc" length="100" not-null="true"/>
</property>
<property name="remarkDesc" type="string">
<column name="remark_desc" length="100" not-null="true"/>
</property>
<property name="listedDate" type="date">
<column name="listed_date" length="10" not-null="true"/>
</property>
</class>
</hibernate-mapping>

Hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@~~~</property>
<property name="hibernate.connection.username">~~~</property>
<property name="hibernate.connection.password">~~</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.default_schema">~~~</property>
<mapping resource="hibernate/Stock.hbm.xml" />
<mapping resource="hibernate/StockDetail.hbm.xml" />
</session-factory>
</hibernate-configuration>

 
5. test

package net.codercn;
import java.util.Date;
import net.codercn.module.Stock;
import net.codercn.module.StockDetail;
import net.codercn.util.HibernateUtil;
import org.hibernate.Session;
public class App {
public static void main(String[] args) {
System.out.println("Maven + Hibernate + Oracle");
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
Stock stock = new Stock();
stock.setStockCode("111");
stock.setStockName("God");
StockDetail stockDetail = new StockDetail();
stockDetail.setCompName("God Internal");
stockDetail.setCompDesc("Greatest Company in heaven");
stockDetail.setRemarkDesc("Nothing Special");
stockDetail.setListedDate(new Date());
stock.setStockDetail(stockDetail);
stockDetail.setStock(stock);
session.save(stock);
session.getTransaction().commit();
System.out.println("insert a record into table");
}
}

 
6. maven pom.xml
 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.codercn</groupId>
<artifactId>Hibernate</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>Hibernate</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.org/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!--  Hibernate  -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>3.6.3.Final</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
<!--  oracle jdbc driver -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>oraclejdbc</artifactId>
<version>10.2.0.3.0</version>
</dependency>
</dependencies>
</project>

 
7. manually install  JDBC driver to local repository:


  • get jdbc driver and put it in an folder(if installed oracle, it always locate at : D:\oracle\product\10.1.0\db_1\jdbc\lib\ojdbc14.jar)
  • go to above jdbc driver folder, run below maven command:

mvn install:install-file -Dfile=ojdbc14.jar -DgroupId=com.oracle -DartifactId
=oraclejdbc -Dversion=10.1.0.2.0 -Dpackaging=jar -DgeneratePom=true
 check your maven local repository (~maven\repository\com\oracle\oracle\10.1.0.2.0), it will install the jdbc driver

 

Above is for XML style, annotation style as below:

package net.codercn.module;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "stock",  uniqueConstraints ={
@UniqueConstraint(columnNames = "stock_name"),
@UniqueConstraint(columnNames = "stock_code")
})
public class Stock implements java.io.Serializable {
private int stockId;
private String stockCode;
private String stockName;
private StockDetail stockDetail;
public Stock(){}
@Id
@GeneratedValue(strategy = GenerationType.AUTO, generator = "my_entity_seq_generator")
@SequenceGenerator(name = "my_entity_seq_generator", sequenceName = "stock_seq")
@Column(name = "stock_id", unique = true, nullable = false)
public int getStockId() {
return stockId;
}
public void setStockId(int stockId) {
this.stockId = stockId;
}
@Column(name = "stock_code", unique = true, nullable = false, length = 10)
public String getStockCode() {
return stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
@Column(name = "stock_name", unique = true, nullable = false, length = 10)
public String getStockName() {
return stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
@OneToOne(fetch = FetchType.LAZY, mappedBy = "stock", cascade = CascadeType.ALL)
public StockDetail getStockDetail() {
return stockDetail;
}
public void setStockDetail(StockDetail stockDetail) {
this.stockDetail = stockDetail;
}
}

 
 

package net.codercn.module;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
@Entity
@Table(name = "stock_detail")
public class StockDetail implements java.io.Serializable {
private int stockId;
private Stock stock;
private String compName;
private String compDesc;
private String remarkDesc;
private Date listedDate;
public StockDetail(){}
@GenericGenerator(name = "generator", strategy = "foreign",
parameters = @Parameter(name = "property", value = "stock"))
@Id
@GeneratedValue(generator = "generator")
@Column(name = "stock_id", unique = true, nullable = false)
public int getStockId() {
return stockId;
}
public void setStockId(int stockId) {
this.stockId = stockId;
}
@OneToOne(fetch = FetchType.LAZY)
@PrimaryKeyJoinColumn
public Stock getStock() {
return stock;
}
public void setStock(Stock stock) {
this.stock = stock;
}
@Column(name = "comp_name", nullable = false, length = 100)
public String getCompName() {
return compName;
}
public void setCompName(String compName) {
this.compName = compName;
}
@Column(name = "comp_desc", nullable = false)
public String getCompDesc() {
return compDesc;
}
public void setCompDesc(String compDesc) {
this.compDesc = compDesc;
}
@Column(name = "remark_desc", nullable = false)
public String getRemarkDesc() {
return remarkDesc;
}
public void setRemarkDesc(String remarkDesc) {
this.remarkDesc = remarkDesc;
}
@Temporal(TemporalType.DATE)
@Column(name = "listed_date", nullable = false, length = 10)
public Date getListedDate() {
return listedDate;
}
public void setListedDate(Date listedDate) {
this.listedDate = listedDate;
}

}

 
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-257666-1-1.html 上篇帖子: SQL92,SQL SERVER,ORACLE,DB2可更新视图概述 下篇帖子: Oracle 11g Extension Statistics and Expression Statistics(原创)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表