当前位置: 首页 > 知识库问答 >
问题:

在Hibernate中的一个事务中添加父子数据

安浩瀚
2023-03-14

我正在编写一个示例java控制台应用程序,它在hibernate中写入数据。所有hibernate配置都已完成。以下是项目的类结构:

public class DBUser implements Serializable {

private static final long serialVersionUID = 1L;

  private int userId;
  private String username;
  private String createdBy;
  private Date createdDate;
  private DBUserDetail userDetail;

  //Getters, Setters and constructors

}

public class DBUserDetail implements Serializable{

  private static final long serialVersionUID = 1L;

  private Integer userId;
  private DBUser user;
  private String compName;
  private String compDesc;
  private String remark;
  private Date listedDate;


   //Getters, Setters and constructors
}

如您所见,一个DBUser只能有一个DBUserDetail,而一个DBUserDetail只能有一个DBUser。假设在一个超文本传输协议请求中,用户同时输入新的DBUser和DBUserDetail数据。所以我想在一个交易中添加这两个信息。下面是我的解决方案:

public void addComplexTypes()
{

    try 
    {

        System.out.println("Hibernate one to one (XML mapping)");

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;

        transaction = session.beginTransaction();       

        DBUser user = new DBUser();
        user.setUsername("username49"); user.setCreatedBy("createdBy49");

        DBUserDetail userDetail = new DBUserDetail();
        userDetail.setCompName("GENTING Malaysia");
        userDetail.setCompDesc("Best resort in the world");
        userDetail.setRemark("Nothing Special");
        userDetail.setListedDate(new Date());

        user.setUserDetail(userDetail);
        userDetail.setUser(user);

        session.save(user);
        transaction.commit();

        System.out.println("Done");

    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

我得到一个错误:

原因:java。sql。SQLIntegrityConstraintViolationException:ORA-02291:违反完整性约束(TAHA_SOZGEN.FK_DBUSERDETAIL)-未找到父密钥

我推断,我必须提前添加DBUser。当第一次搜索DBUser并将其附加到DBUserDetail时,该代码起作用。我更改代码,首先添加DBUser,然后添加DBUserDetail。因此,我将代码修改如下:

public void addComplexTypes()
{

    try 
    {

        System.out.println("Hibernate one to one (XML mapping)");

        Session session = HibernateUtil.getSessionFactory().openSession();
        Transaction transaction = null;

        transaction = session.beginTransaction();       

        DBUser user = this.addDbUser("username49", "createdBy49", session, transaction);
    //  user.setUsername("username49"); user.setCreatedBy("createdBy49");

        if(user == null || user.getUserId() <0)
            throw new RuntimeException(" this.addDbUser unsuccessfull");            

        DBUserDetail userDetail = new DBUserDetail();
        userDetail.setCompName("GENTING Malaysia");
        userDetail.setCompDesc("Best resort in the world");
        userDetail.setRemark("Nothing Special");
        userDetail.setListedDate(new Date());

        user.setUserDetail(userDetail);
        userDetail.setUser(user);

        session.save(user);
        transaction.commit();

        System.out.println("Done");

    } catch (HibernateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


}

    public DBUser addDbUser(String userName, String createdBy,Session session ,Transaction transaction)
{

    try 
    {

        DBUser user = new DBUser();
        int anahtar = Integer.MIN_VALUE;

        user.setUsername(userName);
        user.setCreatedBy(createdBy);
        user.setCreatedDate(new Date());

        anahtar = (Integer)session.save(user);          
        user.setUserId(anahtar);            
        user.setUserId(anahtar);

        return user;

    } catch (HibernateException hata) {
        transaction.rollback();
        // TODO Auto-generated catch block
        hata.printStackTrace();
    }

    return null;

}

我得到了同样的错误:

原因:java。sql。SQLIntegrityConstraintViolationException:ORA-02291:违反完整性约束(TAHA_SOZGEN.FK_DBUSERDETAIL)-未找到父密钥

我怎样才能克服这个问题?

共有1个答案

冯通
2023-03-14

西尔弗芳的回答是正确的。我使用了基于xml的映射,并且如feanor07所述插入了“cascade save update”,但它并没有解决问题。当我使用Silverfang所说的“@OneToOne(mappedBy=“namehere”,cascade=CascadeType.PERSIST)”时,它是有效的。

 类似资料:
  • 我正在将代码从EJB迁移到Spring-Hibernate。如果发生故障,如何加入事务并回滚?下面是EJB中的代码: 更新1:我们如何连接发生在不同数据库上的两个事务?有2个事务需要原子地执行。如果第二个事务失败,则必须回滚第一个事务。对此如何落实?

  • 在以下代码中: 无论我是否注释/取消注释事务,它们都工作正常,即没有事务也保存操作成功执行。但是当我检查留档时,他们总是在插入更新删除之前使用事务。有什么具体原因吗?我错过了什么吗? 请告诉我这件事。我相当困惑:( 当做

  • 问题内容: 关于谷歌搜索,可以找到很多东西,但是我还没有找到解决这个问题的可行方法。 基本上,我想按需加载的特定类上有一个很大的CLOB。天真的方法是: 但是,这不起作用,显然是由于我使用的是oracle驱动程序,即Lob对象没有被视为简单的句柄,而是始终被加载。如此一来,我就被我的尝试所吸引。有一种解决方案使用特殊的工具来进行惰性属性加载,但是由于Hibernate文档似乎表明他们对使它正常工作

  • 我正在尝试使用Hibernate保存数据。一切都发生在同一会话中。逻辑如下: 1)开始交易并尝试保存: 2) 如果新记录违反完整性约束,请在外包装方法中捕获异常,打开另一个事务并查询更多数据 问题是当第二个事务执行时query.list它会抛出一个应该与前一个事务链接的异常。 SQLIntegrityConstraintViolationException:ORA-00001:唯一约束 我应该从另

  • 多个和父子单选按钮。如 如何在java activity android中实现 我想要的是执行基于RadioButton的操作:对于(例如)。如果我选择Radiobutton1,它将执行Subradiobutton1-1和SubRadioButton1-2下指定的所有操作;或;如果我选择Subradiobutton1-2,它将只执行该按钮下指定的操作