Возникает непонятная проблема при использовании 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;
}
}