0

user2つのテーブルがあるとしましょうdomain。ユーザーは1つのドメインを持つことができ、1つのドメインは多くのユーザーのためのものである可能性があります。したがって、単方向の多対1を実行します。

@Entity
@Table(name = "DOMAIN")
public class Domain implements Serializable
{
    @Id
    @Column(name = "DOMAIN_ID")
    private Integer domainId;

    @Column(name = "NAME")
    private String domainName;
}

@Entity
@Table(name = "\"USER\"")
public class User implements Serializable
{
    @Id
    @GeneratedValue(generator = "USER_SEQ")
    @GenericGenerator(name = "USER_SEQ", strategy = "sequence", parameters = @Parameter(name = "sequence", value = "SEQ_USER_ID"))
    @Column(name = "USER_ID", nullable = false)
    private Long userId;

    @Column(name = "FIRST_NAME")
    private String firstName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "DOMAIN_ID")
    @ForeignKey(name = "DOMAIN_ID")
    private Domain domain;
}

Domainテーブルは不変の辞書です。User編集可能なテーブルですが。

新しいユーザーが作成されるドメインをユーザーが選択する基本的なフォームを作成しています。私のコントローラーがそれらのデータを受け取ったとしましょう:

Integer domainId = 1;
String firstName = "aaa";

だから私は新しいユーザーを作成しています:

User newUser = new User();
newUser.setFirstName( firstName );

今私の質問が来ます、私はこのようにすべきですか?

Domain domain = somthingThatWillFetchObjectFromDb.getDomain( domainId );
newUser.setDomain( domain );
//save user

これにより、ドメインをフェッチするための追加のselectが生成されます。もちろんInteger domainId、POJOの代わりに使用することもできますが、それはORMではありません。それでもう一度質問ですが、これはそれが行われるべき方法ですか?

4

2 に答える 2

3

はい、それはあなたがすべきことです。データベースからドメイン情報を実際にロードしたくない場合は、Session.load()メソッドの代わりに奇妙な名前のメソッドを使用してくださいSession.get()。ドメインがまだセッションにロードされていない場合はSession.load()、データベースにアクセスすることなく、ドメインの単一化されたエンティティプロキシを返します(ドメインに遅延関連付けされたエンティティをロードした場合と同じように)。

とはいえ、ドメインが変更できない場合、なぜ@Cascade(CascadeType.ALL)ドメインフィールドに設定するのですか?これは、ユーザーをマージまたは更新するたびに、ドメインもマージまたは更新されることを意味します。さらに悪いことに、ユーザーを削除すると、ドメインも削除されます(もちろん、他のユーザーが同じドメインを参照している場合は、例外が発生します)。

于 2012-11-02T16:23:38.463 に答える
1

はい。のような子エンティティを保存するUserには、親エンティティ、つまりエンティティを設定する必要がありますDomain

もう1つの方法は、親エンティティで双方向マッピング(OneToMany)を定義することです。ドメイン、ロード、Domain1つ以上のUserオブジェクトを追加し、エンティティのみDomainを保存します。例:Domain

Domain実在物:

  @OneToMany(fetch = FetchType.LAZY, mappedBy = "domain")
  List<User> users = null;

  public List<User> getUsers(){
     return this.users;
  }

  public void setUsers(List<User> user){
     this.users = users;
  }

  public void addUser(User user){
     user.setDomain(this);//set the parent entity
     if(this.users==null){
        this.users = new ArrayList<User>();
     }
     this.user.add(user);
  }

次に、ユーザーを保存するには:

   User user1 = new User();
   ......
   User user2 = new User();
   ......
   Domain domain = loadDomain();//<- use actual method to load the domain
   //< add all the users to be saved at once
   domain.addUser(user1); 
   domain.addUser(user2);
   //save parent entity i.e. domain
   saveDomain(domain);//use actual method to save the entity
于 2012-11-02T16:23:22.880 に答える