我正在编写一个示例java控制台应用程序,它在hibernate中写入数据。所有hibernate配置都已完成。以下是项目的类结构:
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。假设在一个超文本传输协议请求中,用户同时输入新的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)-未找到父密钥
我怎样才能克服这个问题?
西尔弗芳的回答是正确的。我使用了基于xml的映射,并且如feanor07所述插入了“cascade save update”,但它并没有解决问题。当我使用Silverfang所说的“@OneToOne(mappedBy=“namehere”,cascade=CascadeType.PERSIST)”时,它是有效的。
我正在将代码从EJB迁移到Spring-Hibernate。如果发生故障,如何加入事务并回滚?下面是EJB中的代码: 更新1:我们如何连接发生在不同数据库上的两个事务?有2个事务需要原子地执行。如果第二个事务失败,则必须回滚第一个事务。对此如何落实?
在以下代码中: 无论我是否注释/取消注释事务,它们都工作正常,即没有事务也保存操作成功执行。但是当我检查留档时,他们总是在插入更新删除之前使用事务。有什么具体原因吗?我错过了什么吗? 请告诉我这件事。我相当困惑:( 当做
问题内容: 关于谷歌搜索,可以找到很多东西,但是我还没有找到解决这个问题的可行方法。 基本上,我想按需加载的特定类上有一个很大的CLOB。天真的方法是: 但是,这不起作用,显然是由于我使用的是oracle驱动程序,即Lob对象没有被视为简单的句柄,而是始终被加载。如此一来,我就被我的尝试所吸引。有一种解决方案使用特殊的工具来进行惰性属性加载,但是由于Hibernate文档似乎表明他们对使它正常工作
我正在尝试使用Hibernate保存数据。一切都发生在同一会话中。逻辑如下: 1)开始交易并尝试保存: 2) 如果新记录违反完整性约束,请在外包装方法中捕获异常,打开另一个事务并查询更多数据 问题是当第二个事务执行时query.list它会抛出一个应该与前一个事务链接的异常。 SQLIntegrityConstraintViolationException:ORA-00001:唯一约束 我应该从另
多个和父子单选按钮。如 如何在java activity android中实现 我想要的是执行基于RadioButton的操作:对于(例如)。如果我选择Radiobutton1,它将执行Subradiobutton1-1和SubRadioButton1-2下指定的所有操作;或;如果我选择Subradiobutton1-2,它将只执行该按钮下指定的操作