1

私は 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権限リストに追加し、管理者だけを永続化する必要がありました。これを行うと、永続化される唯一のエンティティは管理者になります。あなたも同じだと思いませんか?何か不足していますか?

4

2 に答える 2

2

はい。あなたは一つのことを見逃しています。以下のように、エンティティ マッピングのマッピングにcascade = CascadeType.ALLor cascade = CascadeType.PERSIST(適切に選択) を追加するだけです。完了すると、保存も保存されます。oneToManyAdminadimnauthority

     @OneToMany(mappedBy="user", cascade = CascadeType.ALL)
     public Collection<Authority> getAuthorities() {
            return authorities;
     }

cascadeタイプと設定の詳細については、 Hibernate Cascadeを参照してください。

これは、子エンティティでさまざまな動作をサポートするために必要です。たとえば、権限がマスターテーブル、つまり国、通貨などのテーブルからのマッピングであるとします。ここでは、通貨、国を親オブジェクトとともに永続化/削除したくありません。汎用フレームワークであるため、要件のいくつかの側面をサポートする必要があります。

于 2012-10-20T17:17:05.100 に答える
1

実際には、関連付けられたオブジェクトの自動永続化は、マッピングで 2 つの異なる方法で有効にすることができます。

UML が構成と呼ぶもの (つまり、依存オブジェクトが参照オブジェクトから独立して存在できず、他のオブジェクトから参照されない) を表現するには、それを @Embeddable にすることができます。次に、Hibernate は依存オブジェクトをその所有オブジェクト (への関連付け) とともに挿入、更新、および削除します。

UML が集約と呼ぶもの (つまり、参照されるオブジェクトが独自の ID と独立したライフサイクルを持つこと) を表現するには、参照されるオブジェクトを @Entity にします。cascade 属性を指定することで、アソシエーションに沿って永続化操作を自動的にカスケードするよう JPA に指示できます。

そしてもちろん、永続化コンテキストによってロードされたオブジェクトは変更を検出し、トランザクションがコミットされたときにそれらをデータベースに自動的に書き込みます。

于 2012-10-20T17:38:15.810 に答える