【问题标题】:Adding Parent and Child Data in One Transaction in Hibernate在 Hibernate 的一个事务中添加父子数据
【发布时间】:2020-06-18 11:20:08
【问题描述】:

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

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。 假设,在一个 http 请求中,用户同时输入了新的 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) - 未找到父键

我该如何克服这个问题?

【问题讨论】:

  • 在 DBuserDetail 上使用注释。 @OneToOne(mappedBy="namehere", cascade=CascadeType.PERSIST)
  • 我使用的是xml映射,DBUsreDetail的xml映射为:
  • 我找到了this。也许这会帮助我对 xml 映射了解不多
  • 我会检查链接。看来我会变成 Hibernate 配置的注解。
  • @tahasozgen 您不需要切换到基于注释的配置来设置级联类型。您可以在 xml 配置文件中的实体关系定义中使用 cascade="save-update"

标签: java hibernate one-to-one java-console


【解决方案1】:

银牙的回答是对的。我使用了基于 xml 的映射,并且按照 feanor07 的说明插入了“cascade-save-update”,但它并没有解决问题。当我使用 Silverfang 所说的“@OneToOne(mappedBy="namehere", cascade=CascadeType.PERSIST)”时,它可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 2018-02-07
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多