求教,子类继承父类,如何实现将子类和父类的属性写入数据库各自的表中,并做为一个事务进行处理

tiankong888 2018-08-09 04:12:52
求教,子类继承父类,如何实现将子类和父类的属性写入数据库各自的表中,并做为一个事务进行处理(没有异常则全部保存,其中有异常则全部取消保存)

比如:
父类(Person类的属性有: ID, 姓名, 性别, 年龄)
子类(Student类的属性有: ID, 学号, 班级)

现要将Person和Student类的信息写入数据库中对应的表中(Person,Student),如何实现在一个数据库操作的事务中处理父类和子类数据的同时写入。哪位朋友能给点思路,能给个简单代码实现则更好了,谢谢!
...全文
630 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiankong888 2018-08-10
  • 打赏
  • 举报
回复
两个类(或许不在一个包里)共享一个数据库连接进行操作怎么实现啊。能给段代码吗?谢谢了@
tiankong888 2018-08-10
  • 打赏
  • 举报
回复
打开事务 -》进行数据库操作-》提交事务这个步骤我知道.
就是不知道共享一个数据库连接进行操作怎么实现。
stacksoverflow 2018-08-09
  • 打赏
  • 举报
回复
3楼的关闭事务改成提交事务。
stacksoverflow 2018-08-09
  • 打赏
  • 举报
回复
正常些就行了,数据库操作都是执行SQL。
打开事务;
执行父类保存的SQL;
执行子类保存的SQL;
关闭事务;
如出现异常则回滚事务;
天意young 2018-08-09
  • 打赏
  • 举报
回复
建立个数据库连接池,运用本地线程变量就可以实现了
public class JdbcPool {
//通过dbcp jar报得到数据库连接池,交给其他类使用
//其他类调用数据库连接池getConnection
private static DataSource ds;
/**
* 读取配置文件
*
*/
private static Properties getProp(){
InputStream inputStream = JdbcPool.class.getClassLoader().getResourceAsStream("org/sue/jdbc/util/db.properities");
Properties prop =new Properties();
try {
prop.load(inputStream);
} catch (IOException e) {
throw new RuntimeException("找不到配置文件");
}
return prop;
}
static{
try {
Properties prop = getProp();
ds=BasicDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
public DataSource getDs(){
return ds;
}
}

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.sue.jdbc.dbcp.pool.JdbcPool;

public class Connection_Open_Close {
//实例化数据连接池
private static JdbcPool pool =new JdbcPool();
//本地线程变量
private static ThreadLocal<Connection> tLocal =new ThreadLocal<>();
//打开数据库连接
public static Connection getConnection(){
Connection conn= null;
try{
//得到conn 先从本地线程变量取
conn = tLocal.get();
//如果本地线程变量没有
if(conn == null){
//创建一个conn
conn = pool.getDs().getConnection();
//放进本地线程变量
tLocal.set(conn);
}

System.out.println(Thread.currentThread().getName()+"打开了conn"+ conn.hashCode());
} catch (Exception e) {
throw new RuntimeException("找不到文件");
}
return conn;
}

/**
* 开启事务
*/
public static void beginTransaction(){
Connection conn = null;
conn=tLocal.get();
//本地线程变量有conn
if(conn!=null){
try {
conn.setAutoCommit(false);
} catch (SQLException e) {
e.printStackTrace();
}
}
}

/**
* 提交事务
*/
public static void commitTransaction(){
Connection conn = null;
conn = tLocal.get();
//本地线程变量有conn
if(conn!=null){
try {
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//关闭其他服务
public static void closeDB(ResultSet rs,PreparedStatement ppst){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ppst!=null){
try {
ppst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

}
/**
* 回滚
*/
public static void rockback(){
Connection conn = null;
conn=tLocal.get();
//本地线程变量有conn
if(conn!=null){
try {
conn.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 关闭数据库连接
*/
public static void closeConn(){
Connection conn =null;
conn =tLocal.get();
//本地线程变量有conn
if(conn!=null){
try {
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
wildyy 2018-08-09
  • 打赏
  • 举报
回复
给你处理的方法加上事务,方法里就是父类插入操作和子类的插入操作,一旦失败,方法异常,你监控方法有没有异常,有就回滚事务,事务要在进入方法前开启。不知道你知不知道spring的事务管理,它就是这么做的

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧