我有以下课程
@Entity
public class Foobar {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
private Organization organization;
private Long orderNr;
}
我要做的是为此对象创建递增的订单号。问题是orderNr对于每个组织应该是唯一的。例如,假设我们有两个组织(让我们称它们为org1和org2)。首先,我们创建一个Foobar实例,并将组织设置为org1。保存后,orderNr的值应变为“1”。然后我们将创建另一个Foobar实例,并再次将组织设置为org1。 orderNr现在应该得到值'2'(对于Foobar的这个特定实例,第一个Foobar应该仍然具有值'1')。然后我们创建另一个Foobar实例,但是这次我们将组织设置为org2,现在orderNr应该得到值'1',因为这是org2的第一个对象。
实现这一目标的最简单方法是什么? JPA或Hibernate中有什么东西可以让我轻松地做这样的事情(通过使用注释),还是我必须手动跟踪计数器值?
==== 做了一些编辑,因为这个问题被误解了。
答案 0 :(得分:0)
首先,为什么要说“保存时”应设置计数器值?那将是艰难的。我希望相反,您希望在将组织附加到Foobar时设置该值。
其次,正如Paul Keeble在评论中指出的那样,这个值似乎与组织相关,因此属于该类。
您将需要创建一个方法来将Foobars与组织关联(而不是简单地设置成员变量)。此方法必须设置计数器。 所以在Foobar:
public void associateWithOrganization (Organization org) { this.organization = org; org.addAssociation (this); }
并在组织中:
public void addAssociation (Foobar foo) { this.associationCounter ++; } ...
当然,你还需要“getNumberOfAssociationsForThisOrganization()”和“removeAssociation(this)”方法。
答案 1 :(得分:0)
我明白了。尽管有评论,但orderNr
确实属于Foobar
,而不是Organization
。
但是,我认为这应该以不同的方式实施。我不认为Hibernate直接支持你想要的东西。很容易,至少。
我会将时间戳添加到Foobar
,这将保留创建实例的时间。然后,您可以通过运行
orderNr
"SELECT COUNT (*) FROM Foobar WHERE organization = :myOrg AND timestamp < :myTimeStamp"
此外,我可能Organization
有一个List<Foobar>
(即通过@OneToMany(mappedBy = "organization")
映射。当然,也许你不需要它。