Спящий режим с отношением OneToOne - сохраняется только родительский объект

Я новичок в Hibernate, и я изо всех сил пытался сохранить родительский объект без сохранения дочернего объекта (потому что он уже сохранен и был ранее загружен).

Я пытался найти помощь на многих разных интернет-сайтах, но мне не повезло найти тот, который явно имел отношение к моей проблеме. Надеюсь, вы, ребята, можете помочь.

Представьте себе следующий сценарий:

У меня есть объект (TableA), который ссылается на другой объект (TableB).

@Entity
@Table(name = "A")
public class TableA implements Serializable{
     private static final long serialVersionUID = 1L;

     @Id
     @Column(name="idtablea")
     @GeneratedValue(strategy=GenerationType.AUTO)
     private int id;

     @GeneratedValue(generator="IdBGenerator")
     @GenericGenerator(name="IdBGenerator", strategy="foreign", 
            parameters=@Parameter(value="tableB", name="property"))
     private int idb;
     @OneToOne
     @JoinColumn(name = "idtableb", insertable = false, updatable = false)
     private TableB tableB;

     //other properties

     //constructors

     //getters and setters
}

и объект TableB определяется следующим образом:

@Entity
@Table(name = "B")
public class TableB implements Serializable{
     private static final long serialVersionUID = 1L;

     @Id
     @Column(name = "idtableb")
     @GeneratedValue(strategy=GenerationType.AUTO)
     private int id;

     //other properties

     //constructors

     //getters and setters
}

Я создаю экземпляр TableA со ссылкой на экземпляр TableB.

Теперь я хочу сохранить TableA в базе данных (таблица A) и связать ее с таблицей B без сохранения TableB (поскольку она была сохранена в предыдущей транзакции). Для этого я использую следующий код:

Session session = this.sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.persist(TableA);
tx.commit();
session.close();

Каждый раз, когда приведенный выше код выполняется, при попытке зафиксировать транзакцию возникает следующее исключение:

Серьезный: org.hibernate.TransientObjectException: объект ссылается на несохраненный временный экземпляр — сохраните временный экземпляр перед сбросом: com.mypackage.TableB

Не могли бы вы помочь мне понять проблему здесь? Заранее спасибо.

Я использую Java 8, Hibernate 3.6.8 и Spring 4.1.5.


person João Matos    schedule 25.03.2015    source источник


Ответы (1)


Я создаю экземпляр TableA со ссылкой на экземпляр TableB.

Откуда вы получаете этот экземпляр TableB? Вы должны загрузить его из базы данных, где он был сохранен в другой транзакции с использованием Hibernate API (используйте get или предпочтительно load, поскольку вы хотите только установить отношение), а затем установите его в сущность из таблицы A. Похоже, вы создаете новый объект, который является временным, а затем устанавливаете его в сущность из таблицы A. Поскольку граф отношений содержит временную сущность, вы получаете эту ошибку.

person Shailendra    schedule 25.03.2015
comment
Спасибо, Шайлендра. Ты прав. Я создавал новый объект вместо его загрузки. После загрузки объекта из базы данных мне удалось сохранить родительский объект. - person João Matos; 25.03.2015