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