Объект ссылается на несохраненный экземпляр переходного процесса: сохранить временный экземпляр перед промывкой

У меня есть два объекта: PlayerProfileEntity и UserInfoEntity У меня есть соединение с userInfoEntity и PlaterProfileEntity и сохранение моей записи в базе данных следующим образом:

Session session = sessionFactory.openSession();
Transaction tr = session.beginTransaction();
Criteria crit = session.createCriteria(PlayerProfileEntity.class);
player.setUserId(new UserInfoEntity());
player.getUserId().setAddress(user.getUserId().getAddress());
session.save(player);
tr.commit();

Я использовал эту ассоциацию в классе PlayerProfileEntity

@ManyToOne (fetch = FetchType.LAZY)
@Cascade({CascadeType.REFRESH})
@JoinColumn(name="userid")

Я получаю эту ошибку:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save     the transient instance before flushing: com.shared.entity.UserInfoEntity

Примечание. Если я использую CascadeType.All, я получаю эту ошибку:

Cannot add or update a child row: a foreign key constraint fails

Любая идея, как я могу решить эту проблему

Спасибо

Ответы

Ответ 1

TransientObjectException появляется, когда вы пытаетесь сохранить объект, не сохраняя соответствующие соединения. Сначала вам нужно сохранить UserInfoEntity, а затем вы можете сохранить класс PlayerInfoEntity.

player.setUserId(new UserInfoEntity());

Используя это, вы назначаете UserInfoEntity PlayerInfoEntity. Но UserInfoEntity не имеет идентификатора. Как оба будут отображаться? Вот почему приходит исключение.

Надеюсь, это поможет вам.

Ответ 2

Вы должны использовать CascadeType.PERSIST или CascadeType.ALL

Ответ 3

public void savePlayerMethod(PlayerInfoEntity player){

if(player == null){
   player = new PlayerInfoEntity();
}
player.setUserId(getSavedUserInfo());
Session session = SessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(userInfo);
transaction.committ();
}

public UserInfoEntity getSavedUserInfo(){
UserInfoEntity userInfo = new UserInfoEntity();
Session session = SessionFactory.openSession();
Transaction transaction = session.beginTransaction();
session.save(userInfo);
transaction.committ();
}

Ответ 4

Я столкнулся с той же самой ошибкой только сейчас, когда пытался сохранить несохраненный объект, у которого был назначенный идентификатор, с помощью метода Session # save(). Я думаю, что проблема может заключаться в том, что вашему несохраненному объекту-графу уже был присвоен идентификатор (что-то, что пытается выполнить метод save), и это как-то испортило каскад метода save. Попробуйте вместо этого использовать Session # persist(), каскад должен работать с этим, хотя объекту уже назначен идентификатор.

Ответ 5

Ну,

У меня была близкая проблема, и я сделал это

Object tmp = session.get(Object.class,ob.getId())
if(tmp!=null){
    session.evit(tmp); // or merge
}
session.saveOrUpdate(ob);

Это сработало для меня.

Он получает переходный объект и вытесняет его или объединяет.

Теперь используйте метод сохранения или обновления, чтобы сохранить новый объект.