Hibernate OneToMany Mapping - 实体集的保存位置?

时间:2013-02-01 06:26:46

标签: java hibernate orm hibernate-annotations

我有两个名为CustomerActivity的实体类。

CustomercustomerIdcustomerNameactivities此处activities拥有一组Activity对应于每个Customer映射的@OneToMany(mappedBy = "customer")关系。

Customer类的定义如下(为了清楚起见,我删除了其他字段和一些getter和setter):

@javax.persistence.Entity
@Table(name = "CUSTOMER")
public class Customer extends Entity {

    private String customerId;
    private String customerName;
    private Set<Activity> activities;

    @NaturalId
    @Column(name = "CUSTOMER_ID", nullable = false)
    public String getCustomerId() {
        return customerId;
    }

    @Column(name = "CUSTOMER_NAME", nullable = false)
    public String getCustomerName() {
        return customerName;
    }

    @OneToMany(mappedBy = "customer", fetch = FetchType.LAZY)
    @Cascade(CascadeType.SAVE_UPDATE)
    public Set<Activity> getActivities() {
        return activities;
    }
}

ActivityactivityIdactivityNamecustomercustomerId@ManyToOne关系映射。

Activity类的定义如下:

@javax.persistence.Entity
@Table(name = "ACTIVITY")
public class Activity extends Entity {

    private String activityId;
    private String activityName;
    private Customer customer;

    @NaturalId
    @Column(name = "ACTIVITY_ID", nullable = false)
    public String getActivityId() {
        return activityId;
    }

    @Column(name = "ACTIVITY_NAME", nullable = false)
    public String getActivityName() {
        return activityName;
    }

    @ManyToOne
    @JoinColumn(name = "CUSTOMER_ID", nullable = false)
    public Customer getCustomer() {
        return customer;
    }
}

在保存新的Activity之前,我将此Activity添加到activities Customer套。

我想知道:

  • activities Customer被保存的位置?
  • 两个实体的更新和删除操作如何相互影响?
  • 这是创建@OneToMany@ManyToOne关系的正确方法吗?
  • 我可以在activities上添加列名吗?

我是hibernate的初学者,任何指针都对我很有帮助。

提前致谢。

1 个答案:

答案 0 :(得分:1)

- 客户的活动何时被保存?

它们不会在DB中的任何位置保存为“客户活动”。当需要客户的活动时,它们将使用customer_id列上的联接查询与客户一起加载,或者他们稍后加载(延迟加载)使用过滤customer_id列的单独查询。

- 两个实体的更新和删除操作如何相互影响?

删除活动不会影响客户,但下次加载活动时,已删除的活动将不再是该收藏的一部分。

如何使用@ManyToOne上的级联属性定义客户活动的删除,例如:

@OneToMany(mappedBy = "customer", cascade = CascadeType.REMOVE)

基本上,期望的行为取决于活动是否可以在没有客户的情况下独立存在:如果是,则可以删除客户,并且可以在活动表上将customer_id字段设置为null。否则,属于客户的活动将被“级联删除”。或者,在首先删除所有活动之前,不能删除客户。

- 是否是创建@OneToMany和@ManyToOne关系的正确方法?

是的,这是正确的。

- 我可以在活动中添加列名吗?

不,这没有任何意义。一列只能包含一个ID,而活动是一个集合。

我希望这会有所帮助。