@sdorof

Как использовать cascade='persist' с Hibernate и SQLite?

Возникает непонятная проблема при использовании cascade='persist' в Hibernate + SQLite. Имеем классы данных, Company и Person, связанные отношением @OneToMany. В простом приложении сначала создаем объект Company и сохраняем его в базе. Далее открываем новую сессию, загружаем этот объект Company, добавляем в него Person и сохраняем Company. При этом Hibernate должен сам каскадно сохранить добавленный Person. Все очень просто, но у меня возникает ошибка:

ERROR: database is locked
Exception in thread "main" org.hibernate.exception.GenericJDBCException: error performing isolated work


С чем это может быть связано?

Класс Company:

@Entity
public class Company {

	@Id
	@GeneratedValue
	private Long id;

	@OneToMany(mappedBy = "company", cascade = { CascadeType.ALL })
	private Set<Person> staff = new HashSet<>();

	public void addPerson(Person person) {
		if (staff.add(person)) {
			person.setCompany(this);
		}
	}
	
	public Set<Person> getStaff() {
		return staff;
	}
}


Класс Person:

@Entity
public class Person {

	@Id
	@GeneratedValue
	private Long id;

	@ManyToOne
	private Company company;

	public void setCompany(Company company) {
		this.company = company;
	}
}


Тестовое приложение:

public class App {

	public static void main(String[] args) {

		createDatabase();

		Company company;

		Session session = createSessionFactory("validate").openSession();

		company = (Company) session.createCriteria(Company.class).uniqueResult();

		Person person = new Person();
		company.addPerson(person);

		session.beginTransaction();
		session.persist(company);
		session.getTransaction().commit();

		session.close();
	}

	private static void createDatabase() {

		Session session = createSessionFactory("create").openSession();

		Company company = new Company();
		session.beginTransaction();
		session.persist(company);
		session.getTransaction().commit();

		session.close();
	}

	private static SessionFactory createSessionFactory(String ddl) {

		StandardServiceRegistryBuilder serviceRegistryBuilder = new StandardServiceRegistryBuilder()
				.configure("hibernate.cfg.xml");

		serviceRegistryBuilder
				.applySetting("hibernate.hbm2ddl.auto", ddl);

		SessionFactory sessionFactory = new MetadataSources(serviceRegistryBuilder.build())
				.buildMetadata()
				.buildSessionFactory();

		return sessionFactory;
	}
}
  • Вопрос задан
  • 293 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽