【发布时间】: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