0

私は2つのエンティティクラスを持っています:

  • User : ユーザーの資格情報。
  • UserInfo : ユーザーのアナグラフィック情報。

および 1 つのDAO :

  • UserDAO : クラス User の Dao。

それらは、主キーを外部キーとして OneToOne の関係でリンクされます。したがって、User.id は User と UserInfo の両方の主キーです。

データのフェッチはうまく実行されますが、問題は次のとおりです。userDAO を使用してユーザーを保存すると、UserInfo は、保存する必要がある主キーを認識しません。

UserInfo に User が保存されるのを待って共有主キーを知るように指示するにはどうすればよいですか?

私はこの例外を得ました

    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 = -7351729135012380019L;

        @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 ...
    }

ユーザー情報

    @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

    }

ユーザーサービス

    @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();
        }

    }

ユーザーDAO

    @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();
        }

    }
4

1 に答える 1

0

このユーザー ID (プライベート整数 ID;) をどこで開始しましたか?

また、 UserInfo クラスの userId の @column について言及していませんでした

于 2013-10-02T08:46:03.103 に答える