2013-06-24 2 views
0

У меня есть отношение «много-к-одному» между двумя таблицами в моей базе данных. Таблица пользователей & Таблица стран. Классы модели являются:Hibernate save duplicate

@Entity (name = "user") 
public class User { 

     @Id @GeneratedValue (strategy = GenerationType.IDENTITY) 
     private int userId; 
     private String username; 
     private String password; 

     @ManyToOne (cascade = {CascadeType.ALL}) 
     @JoinColumn (name = "countryId") 
     private Country country; 

    //Getter & Setter 
} 


    @Entity (name = "country") 
    public class Country { 

     @Id @GeneratedValue(strategy = GenerationType.AUTO) 
     private int countryId; 
     private String countryName; 
     //Getter & Setter 
} 

Проблема, которую я имею, когда я сохраняю новый объект пользователя также сохраняет новый рекорд страны, даже если эта страна уже существует в базе данных. Как я могу решить эту проблему?

ответ

3

Вы можете попробовать изменить тип каскадный в @ManyToOne отношений:

@ManyToOne (cascade = CascadeType.MERGE) 
@JoinColumn (name = "countryId") 
private Country country; 

При использовании CascadeType.ALL, он также включает в себя, CascadeType.PERSIST, в этом случае, операция сохраняется каскадировано Страна когда ваш persist Пользователь.

+0

Это создает новую проблему. Теперь он не сохраняет объект –

+0

@MarioDennis. Можете ли вы полностью удалить каскад. –

+0

Когда я удаляю его, я получаю: org.hibernate.HibernateException: данные не были сохранены: объект ссылается на несохраненный экземпляр переходного процесса - сохраните временный экземпляр перед промывкой: com.kyrogaming.models.Country –

0

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

Если вам действительно нужно обновить Country, почему бы не сделать это до сохранения User экземпляра?

Использование CascadeType.ALL не очень хорошо, потому что вы потеряете Country, когда вы удалите User.