Добавление родительских и дочерних данных в одну транзакцию в Hibernate - PullRequest
0 голосов
/ 18 июня 2020

Я пишу образец 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) - родительский ключ не найден

Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 22 июня 2020

Ответ Серебряного Клыка правильный. Я использовал сопоставление на основе xml и вставил "cascade-save-update", как указано в feanor07, и это не решает проблему. Когда я использовал "@OneToOne (mappedBy =" namehere ", cascade = CascadeType.PERSIST)", как указано Silverfang, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...