在休眠状态下的一个事务中添加父数据和子数据



我正在编写一个在休眠中写入数据的示例 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( - 未找到父键

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

Silverfang的回答是对的。我使用了基于 xml 的映射,并且我插入了 feanor07 所述的"级联-保存-更新",但它并没有解决问题。当我使用 "@OneToOne(mappedBy="namehere", cascade=CascadeType.PERSIST(" 时,正如 Silverfang 所说,它可以工作。

最新更新