Создание последовательности на основе некоторых критериев - PullRequest
0 голосов
/ 25 августа 2009

У меня есть следующий класс

@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 голосов
/ 26 августа 2009

Я понял. Несмотря на комментарии, orderNr действительно принадлежит Foobar, а не Organization.

Однако я чувствую, что это должно быть реализовано по-другому. Я не думаю, что Hibernate напрямую поддерживает то, что вы хотите. Легко, по крайней мере.

Я бы добавил метку времени к Foobar, которая будет содержать время создания экземпляра. Затем вы можете найти фактическое значение orderNr, выполнив запрос типа

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

Кроме того, я бы, вероятно, Organization имел бы List<Foobar> (т. Е. Сопоставляя его с @OneToMany(mappedBy = "organization"). Конечно, возможно, он вам не нужен.

0 голосов
/ 25 августа 2009

Во-первых, почему вы говорите, что значение счетчика должно быть установлено "при сохранении"? Это будет сложно. Я ожидаю, что вместо этого вы захотите, чтобы значение было установлено в точке, где вы присоединяете организацию к Foobar.

Во-вторых, как отметил Пол Кибл в комментарии, да, это значение, по-видимому, связано с Организацией и поэтому относится к этому классу.

Вам понадобится создать метод для связи Foobars с организациями (в отличие от простой установки переменной-члена). Этот метод должен будет установить счетчик. Так в Foobar:

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

и в организации:

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

Вам также понадобятся методы "getNumberOfAssociationsForThisOrganization ()" и "removeAssociation (this)", конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...