根据一些标准创建序列

时间:2009-08-25 11:19:53

标签: java hibernate jpa

我有以下课程

@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中有什么东西可以让我轻松地做这样的事情(通过使用注释),还是我必须手动跟踪计数器值?

==== 做了一些编辑,因为这个问题被误解了。

2 个答案:

答案 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")映射。当然,也许你不需要它。