All streams
Search
Write a publication
Pull to refresh
34
0.1
Regis @Regis

User

Send message
Здесь под "изоляцией хранения" понимался тот факт, что из самих бизнесс классов была убрана и вынесена в отдельный класс такая вещь, как id.
Не непонятно за что, а за оффтоп.
На самом деле код примеров мог быть намного компактнее. Например реализация метода getBussesByDriver (см. выше) могла состоять всего из одной строчки:
return driver.getBuses();
А как быть с проектами, где persistant-классов не единицы и даже не десятки, а сотни?
Там в самом начале вместо этой абракадабры
private Long roprivate Route route;ute_id;

должно было быть
private Route route;
Возник такой вопрос: а почему в классе Bus вы написали
private Long route_id;

а не
private Long roprivate Route route;ute_id;

? Если так писать, то теряется половина смысла использования Hibernate :(

Если немного переписать модель (только модель, основной ваш код я пока не трогаю) на базе ваших примеров, но с небольшой переделкой путем
1) использования аннотаций (наиболее актуальный вариант на данный момент),
2) изоляции логики связанной с хранением объектов от самих объектов,
3) использования Generics,
то можно получить примерно следующее:


Собственно наши классы:
@Entity
@Table(name = "busses")
public class Bus extends ManagedEntity {
  @NotNull
  @Length(max = 6)
  private String number;  
  
  @NotNull
  @ManyToOne
  @JoinColumn(name = "fk_route")
  private Route route;
  
  @OneToMany(mappedBy = "driver")
  private Set<Driver> drivers;

  // ... 
}


@Entity
@Table(name = "drivers")
public class Driver extends ManagedEntity {
  @NotNull
  @Length(max = 20)
  private String name;
  
  @NotNull
  @Length(max = 20)
  private String surname;
  
  private int age;
  
  @OneToMany(mappedBy = "bus")
  private Set<Bus> busses;
  
  // ... 
}


@Entity
@Table(name = "routes")
public class Route {
  @NotNull
  @Length(max = 30)
  private String name;
  
  @NotNull
  private int number;
  
  @OneToMany(mappedBy = "bus")
  private Set<Bus> busses;
  
  // ...
}



ManagedEntity это класс-предок для наших persistant-объектов:
@MappedSuperclass
public class ManagedEntity extends VersionedEntity {
  public static final long NULL_LONG = 0L;

  @Id
  @GeneratedValue
  @Column(name = "id")
  @NotNull
  private long id = NULL_LONG;
  
  // ...
}



А VersionedEntity - будет обеспечивать оптимистическую блокировку:
@MappedSuperclass
public abstract class VersionedEntity implements Serializable {
  @Version
  @NotNull
  @Column(name = "obj_version")
  private long objVersion;

  // ...
}



Note: аннотацию @Column я почти всюду опустил, чтобы не засорять пример. По дефолту, если этого аттрибута нет, Hibernate будет использовать то же имя, что и имя поля объекта. А так как у нас имя столбца в таблице всюду совпадает с именем поля у объекта, то можно было @Column вообще не использовать.


Мне кажется, что такой код намного нагляднее, чем вариант с заданием маппинга в XML. Хотя некоторые минусы у этого варианта тоже есть.
Обычно рекомендуется из примеров убирать геттеры/сеттеры, заменяя им чем-нибудь вроде
// ...
или
// Default getters and setters
Мне кажется, что с аннотациями было бы проще и понятнее.
Кстати, сомневающимся очень рекомендую попробовать http://www.assembla.com. Там в свободное пользование можно получить готовый к работе SVN репозиторий + Track + вики + систему нотификаций — готовая площадка для ведения проекта небольшого-среднего размера.
Странно. У меня в N++ всё прекрасно верстается. И вполне валидно.
Есть только проблема с тем, что скрипт потенциально могут многократно переставлять для продления лицензии.
— О, привет!
— Привет!
— А заходи-ка ко мне на веб-сайт!
— Это куда?
— Сюда! (* достает айфон *)
Вариант "[моё имя].habrahabr" - не возможен даже если "всё разрешат" - в нем как минимум две кодировки.
Белый текст на черном фоне - всегда был и остатся вреден для глаз.
Вам не кажется, что число 1095 несколько не узладывается в интервал 1901-2000? 1095 - это 95ый год от начала одиннадцатого века, а не прошлого (двадцатого).
Прошлый век: 1901-2000. Не знаете - не пишите.
А они (инвайты) правда существуют?
Уже ранее встречал аналогичный механизм в каком-то зарубежном научном издании. Но вот что это было за издание - не могу вспомнить. В любом случае - технология далеко не нова.
Тогда опять же - для поддержки "транзакционности" в дело идут мьютексы и прочие механизмы синхронизации. А раз мы беремся за это сами - зачем нам теперь реестр, если можно обойтись ini-файликом?

Information

Rating
3,684-th
Registered
Activity