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