我有两个名为Customer
和Activity
的实体类。
Customer
有customerId
,customerName
,activities
此处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;
}
}
Activity
有activityId
,activityName
,customer
,customerId
与@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的初学者,任何指针都对我很有帮助。
提前致谢。
答案 0 :(得分:1)
- 客户的活动何时被保存?
它们不会在DB中的任何位置保存为“客户活动”。当需要客户的活动时,它们将使用customer_id
列上的联接查询与客户一起加载,或者他们稍后加载(延迟加载)使用过滤customer_id
列的单独查询。
- 两个实体的更新和删除操作如何相互影响?
删除活动不会影响客户,但下次加载活动时,已删除的活动将不再是该收藏的一部分。
如何使用@ManyToOne
上的级联属性定义客户活动的删除,例如:
@OneToMany(mappedBy = "customer", cascade = CascadeType.REMOVE)
基本上,期望的行为取决于活动是否可以在没有客户的情况下独立存在:如果是,则可以删除客户,并且可以在活动表上将customer_id
字段设置为null。否则,属于客户的活动将被“级联删除”。或者,在首先删除所有活动之前,不能删除客户。
- 是否是创建@OneToMany和@ManyToOne关系的正确方法?
是的,这是正确的。
- 我可以在活动中添加列名吗?
不,这没有任何意义。一列只能包含一个ID,而活动是一个集合。
我希望这会有所帮助。