0

假设我们有两个表,user并且domain. 用户可能有一个域,一个域可能有多个用户。所以我们将做单向多对一:

@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

这将生成额外的选择,以获取域。当然我可以用Integer domainIdPOJO 代替,但那不是 ORM。那么问题又来了,这是应该做的吗?

4

2 回答 2

3

是的,这就是你应该做的。如果您不想实际从数据库中加载域信息,请使用名称奇怪Session.load()的方法而不是Session.get()方法。如果域尚未加载到会话中,Session.load()将简单地为您返回该域的统一实体代理(就像您加载了一些与域的惰性关联的实体一样),而不会访问数据库。

也就是说,如果域是不可更改的,为什么要@Cascade(CascadeType.ALL)在域字段上设置?这意味着每次您合并或更新用户时,域也将被合并或更新。更糟糕的是:如果您删除一个用户,该域也将被删除(如果其他用户引用同一个域,这当然会导致异常)。

于 2012-11-02T16:23:38.463 回答
1

是的。要保存子实体User,您需要在其中设置父实体,即Domain实体。

另一种方法是在父实体中定义双向映射(OneToMany),即。域,加载Domain,添加一个或多个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 回答