2013-08-20 4 views
9

Я использую Hibernate 3.3.1, и я хотел бы создать связь между людьми и назначенной компанией. Они должны быть слабо связаны, но я хотел бы организовать , чтобы создать компанию через каскад и не явным образом вызвать saveOrUpdate (newCompany).Hibernate @ManyToOne работает только с CascadeType.ALL

Я определил следующие объекты:

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: ссылки на объекты несохраненные переходный экземпляр - сохранить временный экземпляр перед промывкой:consearch.model.core.Company

Когда аннотирования с «каскадом = CascadeType.ALL» она работает, но я не хочу также ccade удаления (например, если компания удалена, то лицо не должно быть удалено)

Мне было интересно, что у этой проблемы не было до Заранее благодарим за помощь. Shane

ответ

10

Возможно, вам необходимо включить Hibernate custom @Cascade при использовании метода JPA Session.saveOrUpdate().
Добавить @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) или использовать Session.persist()

+0

Это был точно правильный ответ, после добавления аннотаций @Cascade , он работал как ожидалось! большое спасибо! – Shannon

+0

Добро пожаловать в SO. Если один из приведенных ниже ответов устраняет вашу проблему, вы должны принять его (щелкните галочку рядом с соответствующим ответом). Это делает две вещи. Это позволяет всем знать, что ваша проблема решена, и это дает человеку, который помогает вам кредитовать помощь. См. [Здесь] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) для полного объяснения. –

+0

@bellabax Как вы пришли к этому решению? Описывается ли это в документации на спящий режим? Не могли бы вы указать ссылку, где эта проблема подробно описана, особенно, почему это происходит? Я нашел это http://www.mkyong.com/hibernate/cascade-jpa-hibernate-annotation-common-mistake/, но на восток не очень понятно, не глядя на источник спячки. – jhegedus

-1

я не чувствую отображения прав

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