代码之家  ›  专栏  ›  技术社区  ›  KCL

根据一些标准创建序列

  •  0
  • KCL  · 技术社区  · 15 年前

    我有以下课程

    @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 回复  |  直到 15 年前
        1
  •  0
  •   CPerkins    15 年前

    首先,为什么说计数器值应该设置为“保存时”?那会很艰难的。我希望相反,您希望在将组织附加到Foobar时设置该值。

    其次,正如Paul Keeble在评论中指出的,是的,这个值似乎与组织有关,因此属于那个类。

    您需要创建一个方法来将foobar与组织相关联(而不是简单地设置一个成员变量)。此方法必须设置计数器。

       public void associateWithOrganization (Organization org) {
          this.organization = org;
          org.addAssociation (this);
       }
    

    在组织上:

       public void addAssociation (Foobar foo) {
          this.associationCounter ++;
       }
       ...
    

    当然,您还需要“getNumberOfAssociationsForThisOrganization()”和“removeAssociation(this)”方法。

        2
  •  0
  •   André Chalella    15 年前

    我得到了它。尽管有评论, orderNr 确实属于 Foobar 而不是 Organization

    然而,我觉得这应该以一种不同的方式来实现。我不认为Hibernate直接支持你想要的东西。至少很容易。

    我会在 福巴 ,它将保存创建实例的时间。然后,你就可以找到 订单号 通过运行如下查询

    "SELECT COUNT (*) FROM Foobar WHERE organization = :myOrg AND timestamp < :myTimeStamp"
    

    组织 有一个 List<Foobar> @OneToMany(mappedBy = "organization")