Получение родительского элемента дочернего элемента в JDO

#java #google-app-engine #google-cloud-datastore #jdo

#java #google-app-engine #google-облачное хранилище данных #jdo

Вопрос:

Я столкнулся с проблемой, связанной с тем, что дочерний элемент не имеет ссылки на своего родителя. Предположительно, у меня настроена двунаправленная связь, в которой я могу получать дочерние элементы от родительского элемента и получать родительский элемент от дочернего элемента; однако родители моих дочерних элементов всегда возвращают значение null.

У меня есть родительский элемент,

 @PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Company {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent(mappedBy = "company")
    private List<Employee> employees = new ArrayList<Employee>();
}
  

С дочерним элементом,

 @PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Employee {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;

    @Persistent
    private Company company;

    @Persistent
    private String username;
}
  

Я сохраняю объект с помощью,

 Company newCompany = new Company();
Employee newEmployee = new Employee();
newEmployee.setUsername("ryan");
newCompany.getEmployees().add(newEmployee);
pm.makePersistent(newCompany);
  

Я обращаюсь к объекту следующим образом,

 Query query = pm.newQuery(Employee.class,"username == s");
query.declareParameters("String s");
List<Employee> employees = (List<Employee>)query.execute(username);
pm.close();

if (employees.size() > 0)
{
    Employee employee = employeeList.get(0);
    ...
}
  

Затем я вижу «company» как null при отладке, в то время как остальные поля сотрудника заполнены. Есть мысли о том, чего мне не хватает?

Комментарии:

1. не могли бы вы поделиться тем, как вы извлекаете объекты и где вы проверяете, что что-то равно null … и, пожалуйста, укажите границы начала / фиксации любой транзакции и / или состояния жизненного цикла объекта

2. Были предоставлены дополнительные подробности.

3. и в каком состоянии находится объект? постоянный -чистый? отсоединен? и если он был отсоединен, вы просили, чтобы поле company было отсоединено? JDOHelper.getObjectState(obj).

4. Состояние кажется «переходным». Запрос на отсоединение не был сделан.

5. таким образом, поле будет нулевым, т. Е. они больше не управляются (pm Был закрыт и т.д.). Предлагаю вам уделять больше внимания тому, откуда вы получаете объекты и где вы закрываете PM

Ответ №1:

Получение родительского элемента зависит от того, где вы его проверяете, в соответствии с состоянием объекта. Если ваш PM был закрыт к этому моменту, то он не будет извлекать родительское поле. Прикосновение к родительскому полю перед закрытием PM (и установлением для retainValues значения true или отсоединением при закрытии PM) приведет к установке родительского поля.