Объект ссылается на несохраненный экземпляр переходного процесса: сохранить временный экземпляр перед промывкой
У меня есть два объекта: 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);
Это сработало для меня.
Он получает переходный объект и вытесняет его или объединяет.
Теперь используйте метод сохранения или обновления, чтобы сохранить новый объект.