У нас есть приложение Java EE, работающее в Glassfish 3.1, где наши модели JPA (с использованием EclipseLink) организованы следующим образом:
Customer
-> String firstName
-> String lastName
-> Address adress
-> List<Attribute> attributes
-> Int age
Address
-> String street
-> Int zip
-> String city
Attribute
-> String code
-> String name
Большинство атрибутов, таких как firstName
и lastName
, являютсяотмечены @Column(nullable=false)
.Теперь мы делаем:
@Stateless
public class CustomerController {
@PersistenceContext(unitName = "CustomerService")
private EntityManager em;
@EJB
private AttributeController attributeController;
public String createCustomer() {
Customer customer = new Customer();
customer.firstName = "Hans";
customer.lastName = "Peter";
customer.address = new Address();
customer.adress.street = ...
customer.attributes = new ArrayList<Attribute>();
customer.attributes.add(attributeController.getByCode("B"));
customer.attributes.add(attributeController.getByCode("T"));
customer.age = 27;
em.persist(customer);
}
}
Это работает для небольших классов, таких как приведенный выше, но теперь мы добавили больше объектов, которые относятся к клиенту как атрибуты с @OneToMany
и загружаются из других @EJBs
как attributeController.
Для "больших" моделей теперь кажется, что транзакция совершается прямо в процессе все еще загрузки связанных объектов, так как мы получаем ERROR: null value in column "age" violates not-null constraint
.Поскольку мы используем транзакции, управляемые контейнером JTA, и не установили для @TransactionAttribute
значение, отличное от значения по умолчанию REQUIRED
, мы не контролируем транзакцию напрямую и понятия не имеем, что здесь происходит.
Есть лиопределенное количество «единиц работы», которые можно получить до совершения коммита?Мы загружаем связанные объекты неправильно?Мы совершили еще одну серьезную ошибку?
Как только мы опускаем ограничения nullable=false
, все работает нормально ...