Hibernate @ManyToOne работает только с CascadeType.ALL

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

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

Мне было интересно, что раньше ни у кого не было этой проблемы. Спасибо заранее за помощь. Шейн


person Shannon    schedule 20.08.2013    source источник


Ответы (2)


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

person Luca Basso Ricci    schedule 20.08.2013
comment
Это был правильный ответ, после добавления аннотации @Cascade все заработало, как и ожидалось! большое спасибо! - person Shannon; 21.08.2013
comment
Добро пожаловать в СО. Если один из приведенных ниже ответов решает вашу проблему, вы должны принять его (установите флажок рядом с соответствующим ответом). Это делает две вещи. Это позволяет всем узнать, что ваша проблема была решена, и дает человеку, который помогает вам, кредит на помощь. Полное объяснение см. здесь. - person Luca Basso Ricci; 24.08.2013
comment
@bellabax Как вы пришли к этому решению? Это описано в документации по спящему режиму? Не могли бы вы указать ссылку, где эта проблема подробно описана, особенно почему это происходит? Я нашел это mkyong.com/hibernate/ но это не очень восточно, чтобы понять, не глядя на исходник гибернации. - person jhegedus; 16.01.2014
comment
пишите здесь (docs.jboss.org /hibernate/annotations/3.5/reference/ru/) - person Luca Basso Ricci; 16.01.2014

я не чувствую, что сопоставления верны

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);    
person Ashish Thukral    schedule 21.08.2013