Hibernate @ManyToOne只能与CascadeType.ALL一起使用。

10

我正在使用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;
}

在我的数据访问对象里,我正在执行以下操作:

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

我遇到了一个异常

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: consearch.model.core.Company

当我使用 "cascade = CascadeType.ALL" 注解时,它可以工作,但我不想自动级联删除(例如如果删除一个公司,则不应该同时删除人员)

我想知道为什么之前没有人遇到这个问题。 感谢您的帮助。 Shane

2个回答

11

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


这正是正确的答案,添加了@Cascade注释后,它按预期工作!非常感谢! - Shannon
欢迎来到SO。如果下面的任何一个答案解决了您的问题,您应该接受它(单击适当答案旁边的复选标记)。这样做两件事情。它让每个人知道您的问题已经解决,并且为帮助您的人提供了帮助的信用。请参见此处获取完整的说明。 - Luca Basso Ricci
@bellabax,你是怎么想到这个解决方案的?它在Hibernate文档中有描述吗?能否指出一个详细描述这个问题的参考资料,特别是为什么会发生这种情况?我找到了这个网址http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/,但是如果不查看Hibernate源代码,很难理解。 - jhegedus
请在此处编写(http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-cascade) - Luca Basso Ricci

-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);    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接