求教,子类继承父类,如何实现将子类和父类的属性写入数据库各自的表中,并做为一个事务进行处理(没有异常则全部保存,其中有异常则全部取消保存)比如: 
父类(Person类的属性有: ID, 姓名, 性别, 年龄)
子类(Student类的属性有: ID, 学号, 班级)现要将Person和Student类的信息写入数据库中对应的表中(Person,Student),如何实现在一个数据库操作的事务中处理父类和子类数据的同时写入。哪位朋友能给点思路,能给个简单代码实现则更好了,谢谢!

解决方案 »

  1.   

    给你处理的方法加上事务,方法里就是父类插入操作和子类的插入操作,一旦失败,方法异常,你监控方法有没有异常,有就回滚事务,事务要在进入方法前开启。不知道你知不知道spring的事务管理,它就是这么做的
      

  2.   

    建立个数据库连接池,运用本地线程变量就可以实现了
    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();
    }
    }
    }
    }
      

  3.   

    正常些就行了,数据库操作都是执行SQL。
    打开事务;
    执行父类保存的SQL;
    执行子类保存的SQL;
    关闭事务;
    如出现异常则回滚事务;