Дочерняя сущность является нулевой после того, как родительская сущность сохраняется и выбирается - PullRequest
0 голосов
/ 20 октября 2011

Пожалуйста, помогите! Это заняло у меня один день, и я не приблизился к решению проблемы. Моя установка выглядит следующим образом:

  1. Затмение Индиго
  2. Eclipselink 2.3
  3. Apache Tomcat 6

Что я делаю, так это сохраняю сущность, которая имеет отображение @OneToOne с дочерней сущностью. Как только запись находится в базе данных, я запускаю команду выбора и успешно выбираю вновь вставленную запись. Тем не менее, дочерняя сущность равна нулю.

Моя цель - вставить только родительскую запись, потому что дочерняя запись уже находится в БД.

Вопрос: что мне нужно изменить, чтобы заполнить дочернюю запись?

У меня есть существо, которое я настойчиво:

EntityManager em = getEntityManager();
try {
    em.getTransaction().begin();
    em.persist(timeSheet);
    em.getTransaction().commit();
}

Сущность содержит @OneToOne:

@Entity
@Cache(expiry=-1)
@Table(name="TIME_SHEET")
    public class TimeSheet implements Serializable {
        private static final long serialVersionUID = 1L;

        @OneToOne(fetch=FetchType.EAGER)
        @JoinColumns({
            @JoinColumn(name="PROJECT_ID", referencedColumnName="PROJECT_ID", nullable = false, insertable=false, updatable=false),
            @JoinColumn(name="COMPANY_ID", referencedColumnName="COMPANY_ID", nullable = false, insertable=false, updatable=false)
        })
        private Project project;
        public Project getProject() {
            return project;
        }

Дочерняя сущность:

@Entity
@Cache(expiry=-1)
@Table(name="PROJECT")
public class Project implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private ProjectPK id;

После сохранения и выбора «Расписания» «Проект» становится пустым. Что я должен сделать, чтобы «проект» был заполнен?

Спасибо!

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Вы должны правильно установить каскадную политику.

@OneToOne(cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#entity-hibspec-cascade

Каскадная политика предписывает, что делать со связанными сущностями при выполнении действия с постоянством над родительской сущностью.

1 голос
/ 20 октября 2011

Что ж, в показанном коде вы сохраняете расписание без предварительной установки в нем проекта, так почему вы ожидаете, что у него будет проект при загрузке? Вы никогда не должны ожидать, что ваша объектная модель будет выглядеть иначе после загрузки, чем когда вы ее сохранили. Если выглядит иначе, значит, у вас проблема.

0 голосов
/ 20 октября 2011

Как указывает Райан, вам нужно сохранить ссылку в расписании на проект. Это потому, что расписание кэшируется. Таким образом, вы можете установить отношения, читая существующий проект при создании расписания или обновляя расписание после фиксации транзакции, чтобы она была построена.

Код, который вы указали, устанавливает поля отношения TimeSheet-> Project только для чтения и не показывает, как заполняются внешние ключи. Удостоверьтесь, что они действительно установлены при вставке TimeSheet через другие сопоставления или, возможно, что TimeSheet законно не имеет Project - хотя поля, похоже, имеют ненулевое ограничение

...