这是this question的延续,我昨天问过。在浏览了各种资源和咨询人员之后,我无法找到任何支持API的JPA注释,用于映射测量单位。所以,我决定自己创建它。
基于Martin Fowler在他的书Analysis Patterns: Reusable Object Models中描述的观察和测量上的各种模式,我尝试创建一个基本实现满足我的需求。我创建了两个实体Unit
和Quantity
,如下所示: -
@Entity
@Table(name = "unit")
public class Unit {
@Id
@Column(name = "symbol")
private String symbol;
@Column(name = "name")
private String name;
@Column(name = "multiplier")
private Number multiplier;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "symbol")
private Unit baseUnit;
public Unit() {
}
public Unit(String symbol, String name, Number multiplier, Unit baseUnit) {
this.symbol = symbol;
this.name = name;
this.multiplier = multiplier;
this.baseUnit = baseUnit;
}
/** Getters and Setters **/
}
@Entity
@Table(name = "quantity")
public class Quantity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int quantityId;
private Number amount;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "unit")
private Unit unit;
public Quantity() {
}
public Quantity(Number amount, Unit unit) {
this.amount = amount;
this.unit = unit;
}
/** Getters and Setters **/
}
在Item
实体中,我有一个Quantity
实体的引用,代表我的unitOfIssue
和unitOfPurchase
。然后,无论我在哪里处理一些数量,我都会有Quantity
引用。
现在,这是我现在面临的问题。由于此处的Quantity
课程为entity
。因此,我们必须将其映射到数据库表。所以,这里需要注意的是,每当我想添加一些数量或更新数量时,一个条目将首先进入Quantity
表,然后它将在Item
表中更新。我想,问题很清楚。我们会在Quantity
表中有大量的条目,这清楚地显示了一个糟糕的设计。
当我在JPA中实现此模式时,是否有人能够深入了解该方法以及我有哪些选择?我该如何解决这个问题?
答案 0 :(得分:1)
我会建议这样做。由于计量单位不太可能经常变化,因此值得将它们构建到代码中。这样你就可以有意义地使用程序本身的值。
如果数据库可以在其他任何地方使用,它也会使数据库更具凝聚力。您还可以将数量扩展为LinearQuantity,ArealQuantity,VolumetricQuantity(等),以确保有人不会尝试购买30英尺的油。
@Embeddable
public class Quantity{
public enum Unit {FEET,METERS,INCHES,MM}
@Enumerated( value = EnumType.STRING)
private Unit unit;
private Number amount;
public Quantity() {
}
}
@Entity
Public Class PurchaseOrder
{
@Embedded
@AttributeOverrides({
@AttributeOverride(name="unit", column=@Column(name="UNIT")),
@AttributeOverride(name="amount", column=@Column(name="AMOUNT"))
})
private Quantity quantity;
....
}
答案 1 :(得分:0)
@OneToOne
做到这一点。以下是示例示例
@Entity
Public Class PurchaseOrder
{
@OneToOne
private Unit unitOfPurchase;
@OneToOne
private Unit unitOfIsuse;
-- Quanity number here ---
}
您应该非常小心地使用Cascade
主表。
答案 2 :(得分:0)
查看此JPA库以获取流行的JScience项目:Map.merge(K, V, BiFunction)
基于对JScience-JPA(JSR 354)的类似支持,我们还计划为Java Monetary types 添加类似内容