【发布时间】:2016-07-05 03:52:49
【问题描述】:
我需要设计一个具有到期日期属性以供使用的某种优惠券的实体。问题是到期日可以是从用户获得优惠券后的一段时间(如 60 天)分配或计算的特定日期。所以我的问题是如何设计一个优惠券实体来满足这个要求,以便我可以轻松获得不同类型优惠券的到期日期?任何建议将不胜感激。
这是一个例子。现在我有 2 个实体,User 和 Coupon,以及这 2 个对象的关系实体。
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
// ....
}
@Entity
@Table(name = "coupon")
public class Coupon {
@Id
@GeneratedValue
private Long id;
private Date dueDate;
private Integer periodDays;
// ...
}
@Entity
@Table(name = "user_coupon")
public class UserCoupon {
@Id
@GeneratedValue
private Long id;
@ManyToOne(fetch = FetchType.Lazy, optional = false)
private User user;
@ManyToOne(fetch = FetchType.Lazy, optional = false)
private Coupon coupon;
private Date dueDate;
/**
* Constructor
*/
public UserCoupon(User user, Coupon coupon) {
this.user = user;
this.coupon = coupon;
if (coupon.getDueDate() != null) {
this.dueDate = coupon.getDueDate();
} else if (coupon.getPeriodDays() != null) {
this.dueDate = DateUtils.addDays(new Date(), coupon.getPeriodDays());
}
}
// ....
}
Coupon 类中填充的dueDate 和periodDays 在业务逻辑上是互斥的。也就是说,优惠券要么有固定的到期日,要么有一个整数属性(periodDays),用于计算用户获得优惠券后的到期日。
现在我可以将这两个字段都放在Coupon 类中,但是当我需要在UserCoupon 类中设置dueDate 字段时,我发现检查哪个字段有点繁琐且不方便Coupon 类中的独占字段为null,最后计算出UserCoupon 类中的dueDate(参见UserCoupon 类构造函数)。
因此,我想知道是否有一些好的实体设计策略可以避免计算到期日时繁琐的字段空检查,并确保Coupon类中的2个字段同时互斥由业务逻辑而非代码排他。
【问题讨论】:
-
你的问题有点宽泛。也许添加您的尝试(即使是在伪代码中)以显示您想要实现的目标。
-
@user1803551 我为我的问题添加了一些代码和详细解释。希望这对你来说很清楚。 :)
-
你不能在
Coupon中创建一个基于dueDate和periodDays计算dueDate值的方法,不管你这样做的逻辑是什么? -
@user1803551 我添加了一个构造函数来从
User和Coupon初始化UserCouponobject,其中包含计算逻辑。