На самом деле код примеров мог быть намного компактнее. Например реализация метода getBussesByDriver (см. выше) могла состоять всего из одной строчки:
return driver.getBuses();
Возник такой вопрос: а почему в классе 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;
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. Хотя некоторые минусы у этого варианта тоже есть.
Кстати, сомневающимся очень рекомендую попробовать http://www.assembla.com. Там в свободное пользование можно получить готовый к работе SVN репозиторий + Track + вики + систему нотификаций — готовая площадка для ведения проекта небольшого-среднего размера.
Вам не кажется, что число 1095 несколько не узладывается в интервал 1901-2000? 1095 - это 95ый год от начала одиннадцатого века, а не прошлого (двадцатого).
Уже ранее встречал аналогичный механизм в каком-то зарубежном научном издании. Но вот что это было за издание - не могу вспомнить. В любом случае - технология далеко не нова.
Тогда опять же - для поддержки "транзакционности" в дело идут мьютексы и прочие механизмы синхронизации. А раз мы беремся за это сами - зачем нам теперь реестр, если можно обойтись ini-файликом?
return driver.getBuses();
должно было быть
а не
? Если так писать, то теряется половина смысла использования Hibernate :(
Если немного переписать модель (только модель, основной ваш код я пока не трогаю) на базе ваших примеров, но с небольшой переделкой путем
1) использования аннотаций (наиболее актуальный вариант на данный момент),
2) изоляции логики связанной с хранением объектов от самих объектов,
3) использования Generics,
то можно получить примерно следующее:
Собственно наши классы:
ManagedEntity это класс-предок для наших persistant-объектов:
А VersionedEntity - будет обеспечивать оптимистическую блокировку:
Note: аннотацию @Column я почти всюду опустил, чтобы не засорять пример. По дефолту, если этого аттрибута нет, Hibernate будет использовать то же имя, что и имя поля объекта. А так как у нас имя столбца в таблице всюду совпадает с именем поля у объекта, то можно было @Column вообще не использовать.
Мне кажется, что такой код намного нагляднее, чем вариант с заданием маппинга в XML. Хотя некоторые минусы у этого варианта тоже есть.
// ...
или
// Default getters and setters
— Привет!
— А заходи-ка ко мне на веб-сайт!
— Это куда?
— Сюда! (* достает айфон *)