2013-10-01 4 views
0

У меня есть два Entity классы:Hibernate One-To-One DAO

  • пользователя: учетные данные пользователя.
  • UserInfo: абзацная информация пользователя.

и один DAO:

  • UserDAO: Dao для класса пользователя.

Они связаны с отношением OneToOne с помощью первичного ключа как внешнего ключа. Таким образом, User.id является основным ключом как для пользователя, так и для UserInfo.

Сбор данных хорошо работает, но проблема заключается в следующем: когда я сохраняю пользователя с userDAO, UserInfo не знает первичного ключа, с которым он должен быть сохранен.

Как сообщить UserInfo, что пользователь должен быть сохранен, чтобы узнать его общий первичный ключ?

Я получил это исключение

Request processing failed; nested exception is org.hibernate.id.IdentifierGenerationException: attempted to assign id from null one-to-one property [com.marciani.sample.entity.user.model.UserInfo.user] 

Спасибо заранее!

Это код:

Пользователь

@Entity 
    @Table(name = "users") 
    public class User implements Serializable { 

     private static final long serialVersionUID = -7351729135L; 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     @Column(name = "user_id", nullable = false, unique = true) 
     private Integer id; 

     @Column(name = "username", nullable = false, unique = true, length = 25) 
     private String username; 

     @Column(name = "password", nullable = false, unique = false, length = 25) 
     private String password; 

     @ManyToOne(fetch = FetchType.EAGER) 
     @JoinColumn(name = "role_id", nullable = false) 
     @ForeignKey(name = "fk_user_role") 
     private Role role; 

     @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.LAZY, optional = false) 
     private UserInfo userInfo; 

     public User(String username, String password, Role role, UserInfo userInfo) { 
      this.username = username; 
      this.password = password; 
      this.role = role; 
      this.userInfo = userInfo; 
     } 

     public User() {} 

      //Getters/Setters ... 
    } 

UserInfo

@Entity 
    @Table(name = "users_info") 
    public class UserInfo implements Serializable { 

     private static final long serialVersionUID = 3977944889257599040L; 

     @Id  
     @GeneratedValue(generator="gen") 
     @GenericGenerator(name="gen", strategy="foreign", parameters={@Parameter(name="property", value="user")}) 
     private Integer userId; 

     @Column(name = "firstname", nullable = false, unique = false, length = 25) 
     private String firstname; 

     @Column(name = "lastname", nullable = false, unique = false, length = 25) 
     private String lastname; 

     @Column(name = "email", nullable = false, unique = false, length = 50) 
     private String email; 

     @OneToOne 
     @MapsId 
     private User user; 

     public UserInfo(String firstname, String lastname, String email) { 
      this.firstname = firstname; 
      this.lastname = lastname; 
      this.email = email; 
     } 

     public UserInfo() {} 

      //Getters/Setters 

    } 

UserService

@Service("userService") 
    public class UserServiceImpl implements UserService { 

     @Autowired 
     private UserDAO userDAO; 

     @Override 
     @Transactional(readOnly = false) 
     public void saveUser(User user) { 
      userDAO.saveUser(user); 
     } 

     @Override 
     @Transactional(readOnly = false) 
     public void deleteUser(String username) { 
      User user = findByUsername(username); 
      userDAO.deleteUser(user);  
     } 

     @Override 
     @Transactional(readOnly = true) 
     public User findByUsername(String username) { 
      Criterion criterion = Restrictions.eq("username", username); 
      List<User> list = userDAO.find(criterion); 
      return list.get(0); 
     } 

     @Override 
     @Transactional(readOnly = true) 
     public User getUser(String username, String password) { 
      Criterion criterion = Restrictions.conjunction() 
      .add(Restrictions.eq("username", username)) 
      .add(Restrictions.eq("password", password)); 
      List<User> list = userDAO.find(criterion); 
      if (list.size() > 0) { 
       return list.get(0); 
      } else { 
       return null; 
      }  
     } 

     @Override 
     @Transactional(readOnly = true) 
     public List<User> findAll() { 
      return userDAO.findAll(); 
     } 

    } 

UserDAO

@Repository 
    public class UserDAOImpl implements UserDAO { 

     @Autowired 
     public SessionFactory sessionFactory; 

     public Session getCurrentSession() { 
      return sessionFactory.getCurrentSession(); 
     } 

     @Override 
     public void saveUser(User user) { 
      getCurrentSession().saveOrUpdate(user);;   
     } 

     @Override 
     public void deleteUser(User user) { 
      getCurrentSession().delete(user); 
     } 

     @Override 
     public List<User> find(Criterion criterion) { 
      Criteria criteria = getCurrentSession().createCriteria(User.class); 
      criteria.add(criterion); 
      return criteria.list(); 
     } 

     @Override 
     public List<User> findAll() { 
      Criteria criteria = getCurrentSession().createCriteria(User.class); 
      return criteria.list(); 
     } 

    } 

ответ

0

где вы инициировать этот идентификатор пользователя ( личное целочисленный идентификатор;)

также вы не упомянули @column для USERID класса UserInfo