addAuto
и removeAuto
, что находится вне сессии. Модель не должна содержать никаких методов кроме сеттеров и геттеров. DAO должны обеспечивать IO операции. А вся бизнес-логика в сервисах. main
нужно поместить внутрь транзакции (или часть кода). Также можно использовать не openSession
, а getCurrentSession
.@Entity
@Table(name = "ACCOUNTS")
public class Account {
@Id
@Column(name = "ACCOUNT_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "accounts_account_id_seq")
@SequenceGenerator(name = "accounts_account_seq", sequenceName = "accounts_account_seq",
allocationSize = 1)
private long id;
@Column(name = "NUMBER", nullable = false, unique = true)
private String number;
@Column(name = "BALANCE", nullable = false, precision = 19, scale = 4,
columnDefinition = "DECIMAL(19,4)")
private BigDecimal balance;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "PERSON_ID", nullable = false)
private Person owner;
//Getters and setters
@Entity
@Table(name = "PERSONS")
public class Person {
@Id
@Column(name = "PERSON_ID")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "persons_person_id_seq")
@SequenceGenerator(name = "persons_person_seq", sequenceName = "persons_person_seq",
allocationSize = 1)
private long id;
@Column(name = "UUID", nullable = false, unique = true)
private String uuid;
@Column(name = "FIRST_NAME", nullable = false)
private String firstName;
@Column(name = "LAST_NAME", nullable = false)
private String lastName;
@Column(name = "EMAIL", nullable = true)
private String email;
@Column(name = "PHONE", nullable = false)
private String phone;
@Column(name = "ADDRESS", nullable = false)
private String address;
@OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
private List<Account> accounts;
@Service
public class RequestServiceImpl implements RequestService {
...
public List<Request> findByName(String name) {
Hibernate.initialize(requestRepository.findByNameContaining(name));
return requestRepository.findByNameContaining(name);
}
...
}
<IfModule mod_dir.c>
DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm
</IfModule>
<?php
phpinfo();
?>
Пример кейса.
У пользователя появляется новая машина и вам необходимо добавить эту информацию в БД. Эта задача выполняется в методе сервиса:
1) открываете сессию;
2) начинаете транзакцию;
3) вызываете метод DAO "найти пользователя" (по ID, по имени или т.д.);
4) инициализируете прокси объект, чтобы загрузились данные по связи @OneToMany (
Hibernate.initialize(user.getAoutos)
)5) добавляете машину в список машин пользователя;
6) обновляете запись в БД (если не настроено каскадное обновление, то отдельно сохраняем новую машину)
7) коммитим транзакцию
8) закрываем сессию (сессию лучше закрывать в блоке finally() или использовать try с ресурсами на случай если вылетит исключение)