使用hibernate映射oracle两个表空间的表,Hibernate每个具体类一张表映射(使用XML)

在每个具体类一个表中,数据库中将有三个表但彼此之间没有关系(关联)。 根据具体类策略将表格映射到表有两种方法。

由union-subclass元素指定

通过自我为每个类创建表

我们来了解映射的层次结构。

ba030c3f9b189ac01cfa7b628123bb34.png

下面来看看看我们如何通过union-subclass元素映射这个层次结构, employee.hbm.xml文件的内容如下

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

table="regemp122">

table="contemp122">

在每个具体类一张表的情况下,数据库中将有三个表,每个表表示一个特定的类。

类的union-subclass子元素指定子类。 它将父表的列添加到此表中。换句话说,将它们作为一个联合。

每个表的格结构如下:

Employee类的表结构 -

CREATE TABLE `emp122` (

`id` int(11) NOT NULL,

`name` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Regular_Employee类的表结构 -

CREATE TABLE `regemp122` (

`id` int(11) NOT NULL,

`name` varchar(255) DEFAULT NULL,

`salary` float DEFAULT NULL,

`bonus` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Contract_Employee类的表结构 -

CREATE TABLE `contemp122` (

`id` int(11) NOT NULL,

`name` varchar(255) DEFAULT NULL,

`pay_per_hour` float DEFAULT NULL,

`contract_duration` varchar(255) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

每个具体类的表示例

在这个例子中,我们创建了三个类,并在employee.hbm.xml文件中提供了这些类的映射。创建一个项目:inheritance2, 完整的项目结构如下 -

2ed056e99a341b375ac3cf07ed2790c9.png

1)创建持久类

您需要创建表示继承的持久化类。 让我们为上面的层次结构创建三个类:

文件:Employee.java

package com.yiibai;

public class Employee {

private int id;

private String name;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

文件:Regular_Employee.java

package com.yiibai;

/**

*

* @author by maxsu

* @copyright http://www.yiibai.com

* @link download at: http://www.yiibai.com/siteinfo/download.html

*/

public class Regular_Employee extends Employee {

private float salary;

private int bonus;

public float getSalary() {

return salary;

}

public void setSalary(float salary) {

this.salary = salary;

}

public int getBonus() {

return bonus;

}

public void setBonus(int bonus) {

this.bonus = bonus;

}

}

文件:Contract_Employee.java

package com.yiibai;

/**

*

* @author by maxsu

* @copyright http://www.yiibai.com

* @link download at: http://www.yiibai.com/siteinfo/download.html

*/

public class Contract_Employee extends Employee {

private float pay_per_hour;

private String contract_duration;

public float getPay_per_hour() {

return pay_per_hour;

}

public void setPay_per_hour(float payPerHour) {

pay_per_hour = payPerHour;

}

public String getContract_duration() {

return contract_duration;

}

public void setContract_duration(String contractDuration) {

contract_duration = contractDuration;

}

}

2)创建持久类的映射文件

上面已经了解了层次结构,接下来看看映射配置。

文件:employee.hbm.xml

/p>

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

table="regemp122">

table="contemp122">

3)在配置文件中添加hbm文件的映射

打开hibernate.cfg.xml文件,并添加如下映射资源的项:

现在配置文件将如下所示:

文件:hibernate.cfg.xml

/p>

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

update

com.mysql.jdbc.Driver

jdbc:mysql://localhost:3306/test

root

123456

org.hibernate.dialect.MySQL5InnoDBDialect

true

hbm2ddl.auto属性定义是用于在数据库中创建自动表。

4)创建存储持久对象的类

在这个类中,我们只是将Employee 对象存储在数据库表中。

文件:MainTest.java

package com.yiibai;

import org.hibernate.*;

import org.hibernate.boot.MetadataSources;

import org.hibernate.boot.registry.StandardServiceRegistry;

import org.hibernate.boot.registry.StandardServiceRegistryBuilder;

/**

*

* @author by maxsu

* @copyright http://www.yiibai.com

* @link download at: http://www.yiibai.com/siteinfo/download.html

*/

public class MainTest {

public static void main(String[] args) {

// 但在5.1.0版本汇总,hibernate则采用如下新方式获取:

// 1. 配置类型安全的准服务注册类,这是当前应用的单例对象,不作修改,所以声明为final

// 在configure("cfg/hibernate.cfg.xml")方法中,如果不指定资源路径,默认在类路径下寻找名为hibernate.cfg.xml的文件

final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()

.configure("hibernate.cfg.xml").build();

// 2. 根据服务注册类创建一个元数据资源集,同时构建元数据并生成应用一般唯一的的session工厂

SessionFactory sessionFactory = new MetadataSources(registry)

.buildMetadata().buildSessionFactory();

/**** 上面是配置准备,下面开始我们的数据库操作 ******/

Session session = sessionFactory.openSession();// 从会话工厂获取一个session

// creating transaction object

Transaction t = session.beginTransaction();

Employee e1 = new Employee();

e1.setName("用户名-01");

Regular_Employee e2 = new Regular_Employee();

e2.setName("yiibai su");

e2.setSalary(50002);

e2.setBonus(5);

Contract_Employee e3 = new Contract_Employee();

e3.setName("Mina su");

e3.setPay_per_hour(1010);

e3.setContract_duration("15 hours");

session.persist(e1);

session.persist(e2);

session.persist(e3);

t.commit();

session.close();

System.out.println("success");

}

}

执行上面代码运行测试即可,应该会自动创建三张表,并插入数据。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值