9

我正在使用 Hibernate 3.3.1,我想在人员和指定公司之间建立关系。它们应该是松散耦合的,但我想安排通过级联创建公司,而不是显式调用 saveOrUpdate(newCompany)。

我定义了以下实体:

class Company
{
   @Id
   Long companyId;
   String name;
}

class Person
{
   @Id
   Long personId;
   String name;
   @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.MERGE})
   Company company;
}

在我的 dao 中,我正在执行以下操作:

testpers.setCompany (newCompany);
session.saveOrUpdate(testpers);

我得到一个例外

org.hibernate.TransientObjectException:对象引用了一个未保存的瞬态实例 - 在刷新之前保存瞬态实例:consearch.model.core.Company

当使用“cascade = CascadeType.ALL”进行注释时,它可以工作,但我不想也 ccade 删除(例如,如果一个公司被删除,那么这个人不应该被删除)

我想知道在此之前没有人遇到这个问题提前感谢您帮助我。谢恩

4

2 回答 2

10

@Cascade使用非 JPASession.saveOrUpdate()方法时,您可能需要启用 Hibernate 自定义。
添加@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)或使用Session.persist()

于 2013-08-20T22:04:40.867 回答
-2

我觉得映射不正确

class Company
{
@Id
Long companyId;
String name;
@OneToMany(fetch = FetchType.LAZY,mappedBy="company"
@Cascade({CascadeType.SAVE_UPDATE})
List<Person> persons;
}

class Person
{
@Id
Long personId;
String name;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="company_id")
Company company;
}

现在这样设置

Company c=new Company();
List<Person> plist=new ArrayList<>();
Person p=new Person();
p.setCompany(c);
plist.add(p);
c.setPersons(plist);
dao.save(c);    
于 2013-08-21T05:41:16.483 回答