Может какой то параметр есть для этого или аннотация?
Specification<T>
& Criteria API. А на больших проектах тут уже использовать Hibernate Search, ElasticSearch, Apache Lucene public Specification<User> applicationSpecification(
// search arguments
) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (StringUtils.isNotBlank(status)) {
Predicate predicate = criteriaBuilder.like(// Your code here);
predicates.add(predicate);
}
// other search conditions
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
Converter<S,T>
содержащийся в Spring. Он принимает 2 дженерика - source & target. EventDTOMapper implements Converter<EventDTO, Event>
@PostMapping("")
можно не указывать скобки, а просто @PostMapping
. return ResponseEntity(created, HttpStatus.OK)
ResponseEntity.ok(created);
Следуя документации, hibernate должен сам подтягивать по id нужный Subject из бд, но он этого не делает, ругаясь на отсутствие конструктора.
<mapping class="hibernate.entity.User"/>
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:mysql://localhost:3306/spring_course</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.username">root</property>
<property name="connection.password">springcourse</property>
<property name="current_session_context_class">thread</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping class="hibernate.entity.User"/>
</session-factory>
</hibernate-configuration>
List<Foo>
или любую другую коллекцию не самая лучшая идея.Stream<Foo>
FooRepository {
@QueryHints(value = {
@QueryHint(name = HINT_FETCH_SIZE, value = "1000"),
@QueryHint(name = HINT_CACHEABLE, value = "false"),
@QueryHint(name = READ_ONLY, value = "true")
})
@Query(value = "SELECT DISTINCT f FROM Foo f")
@Transactional(readOnly = true)
Stream<Foo> findFoos();
}
parallelStream()
map()
и в конце сохранить...@Async
и используйте @Scheduled
(или возможности Spring Batch, Spring Quartz)Но т.к. могут быть разные шаблоны html, то невозможно хранить данные для заполнения в одном конкретном классе.
Краткий принцип работы: происходит добавления емейла в очередь в БД, через некоторое время специальный сервис отправляет это сообщение.
th:href="@{findOne/(id=${tour.id})}"
Converter<S, T>
или же либу MapStruct, ModelMapper и др.BeanUtils.copyProperties()
например, для обновления сущности.@ResponseBody
public Tour findOne(Integer id) {
return tourRepository.findById(id).get();
}
get()
лучше использовать например, orElseThrow()
и выбросить исключение, которое впоследствиее можно при помощи ExceptionHandler обработать и вернуть корректный http ответ. Например, когда объект не найден (404) @Autowired
private TourRepository tourRepository;
@PostMapping("/save")
public String save(@ModelAttribute(name = "tour") Tour tour) {
tourRepository.save(tour);
return "redirect:/";
}
@PostMapping("/admin/saveTour")
public String saveTourInModal(@ModelAttribute(name = "tour") Tour tour) {
tourRepository.save(tour);
return "redirect:/admin/tourList";
}
Само модальное окно вызывается и заполняется данными объекта. После нажатия на кнопку сохранения, у меня стало выводить исключение org.hibernate.exception.ConstraintViolationException: could not execute statement, и что поля бд title и description не могут быть null.
Hibernate: update tour set description=?, end_time=?, image=?, price=?, start_time=?, title=? where code=?
Hibernate: insert into tour (description, end_time, image, price, start_time, title) values (?, ?, ?, ?, ?, ?)
addAll()
. либо же раз решили итерировать, тоadd()
и remove()
List<Address> addressList = oldUser.getAddress()
getAddress()
подразумевает получение одного адреса, а не списка адресов пользователя. Должно быть getAddresses()
, ну а метод getAddress()
должен возвращать 1 адресclass Rate {
@ManyToOne(fetch = FetchType.LAZY)
private Tarif tarif;
@ManyToOne(fetch = FetchType.LAZY)
private TarifGarant tarifGarant;
}
class Tarif {
@OneToMany(
mappedBy = "tarif",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Rate> rates;
}
class TarifGarant {
@OneToMany(
mappedBy = "tarifGarant",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<Rate> rates;
}
<!-- https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-core -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-core</artifactId>
<version>6.0.0.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.8.Final</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.6.6</version>
</dependency>
@Embeddable
для Activity и вместо связи OneToMany для List использовтаь @ElementCollection
или @CollectionOfElements
для List<Address>
@EmbeddedId
https://www.baeldung.com/spring-jpa-embedded-metho... @Embeddable & @Embedded
<dependency>
<groupId>com.vladmihalcea</groupId>
<artifactId>hibernate-types-52</artifactId>
<version>2.2.2</version>
</dependency>
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
private List<Child> children;
+----------+------------+----------+
| order_id | product_id | quantity |
+----------+------------+----------+
| 1 | 2 | 10 |
| 2 | 3 | 11 |
+----------+------------+----------+
Product {
long productId;
}
Order {
long orderId;
}
OrderData {
Order order;
Product product;
int quantity;
}
Product {
long productId;
}
Order {
@MapKeyColumn(name = "product_id")
@Column(name = "quantity")
Map<Long, Integer>
}
void addArticleToAuthor(Article article)
author.save()
Converter<S,T>
Оптимальность, чтобы не надо было передавать лишних полей, если они не заносятся в таблицу или автогенерируются
В JSON в поле one-to-many (например при создании юзера у него будут животные) чтобы передавался только массив idшников животных, а не полностью вся информация о них (частично пересекается с первым пунктом - оптимальность)
setPets()
или метод addPet()