私は Hibernate ORM を初めて使用します。理解を深めるのに役立つと思います。より正確には、関心の分離が非常にうまく実装されているかどうかを考えていることに気付きました (もちろん、そうです。理解できないのは私ですが、説明してください)。説明させてください。休止状態の主な目標は、開発者がデータベースの特性を忘れてクラスを処理できるようにすることだと私には思えます。良い!しかし、このケースを調べてみましょう:
私はオブジェクトを持っています.Athorityオブジェクトと1対5の関係を持つUserDetailとしましょう。
@Entity(name="user")
@Table(name="USERS")
public class User implements UserDetails, DomainObject {
private static final long serialVersionUID = 1L;
private long id;
private String username;
private String password;
Collection<Authority> authorities = new ArrayList<Authority>();
public User() {
super();
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", unique=true, nullable=false)
public long getId() {
return id;
}
//various getters & setters
@OneToMany(mappedBy="user")
public Collection<Authority> getAuthorities() {
return authorities;
}
public void setAuthorities(Collection<Authority> authorities) {
this.authorities = authorities;
}
}
これが機関オブジェクトです
@Entity(name="authority")
@Table(name="AUTHORITIES")
public class Authority implements GrantedAuthority, DomainObject{
private long id;
private User user;
private String authority; //Spring Security demands them to start with "ROLE_"
public Authority() {
super();
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id", unique=true, nullable=false)
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@ManyToOne
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Column(name="authority", nullable=false)
public String getAuthority() {
return this.authority;
}
public void setAuthority(String authority) {
this.authority = authority;
}
}
さて、UserDaoImpl と AuthorityDaoImpl があるとしましょう (ここでは簡潔にするために省略しています)。新しい UserDetails を作成して永続化したい場合は、次の手順を実行する必要があります (これは初期化子 Bean ですが、ここでは問題ありません)。
@Component
public class Initializer {
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;
@Autowired
@Qualifier("authorityDaoImpl")
private AuthorityDao authorityDao;
@PostConstruct
public void init()
{
if(userDao.loadUserByUsername("admin")==null)
{
System.out.println("starting initialization.");
User admin = new User();
admin.setUsername("admin");
admin.setPassword("admin");
Authority authority = new Authority();
authority.setAuthority("ROLE_ADMIN");
authority.setUser(admin);
admin.getAuthorities().add(authority);
userDao.save(admin);
authorityDao.save(authority);
System.out.println("admin user created.");
}
}
}
わかりました。Authority オブジェクトを永続化するために、AuthorityDao を明示的に呼び出さなければならないのは奇妙です。関心の分離が適切に実装されていれば、authority
オブジェクトをadmin
権限リストに追加し、管理者だけを永続化する必要がありました。これを行うと、永続化される唯一のエンティティは管理者になります。あなたも同じだと思いませんか?何か不足していますか?