@Id
. @UniqueConstraint
должно быть достаточно.@Entity
@Table(name = "category")
@Data
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@Column(length = 1000)
private String description;
@ManyToMany(mappedBy = "categoryList")
private List<Product> productList;
}
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@Column(length = 1000)
private String description;
private double price;
@ManyToMany(fetch = FetchType.LAZY, cascade = {
CascadeType.PERSIST,
CascadeType.MERGE
})
@JoinTable(name = "product_categories",
joinColumns = @JoinColumn(name = "product_id"),
inverseJoinColumns = @JoinColumn(name = "category_id"))
private List<Category> categoryList;
}
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
public class HibernateUtil {
final static StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
.configure()
.build();
private static final SessionFactory sessionFactory;
static {
try {
sessionFactory = new MetadataSources(registry).buildMetadata()
.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getSession()
throws HibernateException {
Session session = null;
try {
session = sessionFactory.getCurrentSession();
} catch (org.hibernate.HibernateException he) {
session = sessionFactory.openSession();
}
return session;
}
}
Session session = HibernateUtil.getSession();
session.beginTransaction();
note.setTitle("Example");
session.merge(note);
session.getTransaction().commit();
session.close();
как это сделать в Spring проекте где нету main`a
spring.jpa.hibernate.ddl-auto=create-drop
Вот эту часть кода по логике надо писать в модели прям над названием класса?
Теперь когда я хочу найти компании с паспортом работника, по логике я могу вызвать этот query и вызывать я его должен в классе Cервиса верно?
Так же возникает вопрос, если мы используем HQL и нам нужно написать какой то один непопулярный запрос, который допустим будет использован всего один раз во всем проекте.
Because OSIV creates a Session at the beginning of the request, the transactional proxy uses the current available Session instead of creating a brand new one.
not-null property references a null or transient value : com.SchoolJournal.SpringHibernate.model.Pupil.name
@Column(name = '"`name`", nullable = false)
@Getter
@Setter
private String name;
Хочу добавить в этот класс поле, которого нет в базе
@Transient
@Transient
private long calc;
...которое вычисляется на основе других полей.
@Formula
@Formula
создать метод с аннотацией @PostConstruct
и затем уже инициализировать ваше поле с нужным значением CascadeType.MERGE,
CascadeType.PERSIST
orphanRemovel = false;
orphanRemoval = true,
то если у клиента будет отсутствовать lessonId, то он будет удален, так как является "сиротой". А если наоборот false, то удаляться не будет.@ManyToOne(fetch = FetchType.LAZY, optional = true)
@JoinColumn(name = "project_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Project project;
delete()
и будет выброшено то исключение, которе вам нужно.
JPA does offer possibility to cascade operations (merge, persist, refresh, remove) to associated entities. Logic is in JPA and does not utilize database cascades.
There is no JPA standard compliant way to do cascades with database cascades.
There is no clean cut means to do this in JPA. The following will get you what you want... You can use CascadeType.DELETE, however this annotation only applies to the objects in the EntityManager, not the database. You want to be sure that ON DELETE CASCADE is added to the database constraint. To verify, you can configure JPA to generate a ddl file. Take a look at the ddl file, you'll notice that ON DELETE CASCADE is not part of the constraint. Add ON DELETE CASCADE to actual SQL in the ddl file, then update your database schema from the ddl. This will fix your problem .
CrudCourseRepository
Как JpaRepository производит обновление связей в таблице student_courses?
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
Насколько я понимаю, если я попытаюсь обновить сущность Student, передав в CrudStudentRepository#save() студента с пустым списком курсов, то в таблице student_courses будут удалены все записи, в которых фигурирует обновляемый студент, но по моему опыту этого не происходит. Как мне тогда удалять/обновлять эти записи?
CascadeType.All
или PERSIST & MERGEOptional<City> findCityByCityName(String cityName);
Как сделать, чтобы hibernate не пытался добавить запись в таблицу городов, если там уже есть нужный город?
orElseThrow()
выбросить RuntimeException исключение о том, что такой город есть. Можно создать свое исключение типа: CityExistsException
boolean existsByCityName(String cityName);
А дальше также если true, то выбрасываете исключение IllegalArgumentException: Validation failed for query for method findByBody(String body)
public interface ExpressionRepository extends CrudRepository<ExpressionEntity, Long> {
@Query("FROM ExpressionEntity WHERE ExpressionEntity.body = body")
public Optional<ExpressionEntity> findByBody(String body);
}
SELECT e FROM ExpressionEntity e WHERE e.body = ?1
<profiles>
<profile>
<id>production</id>
<properties>
<schema.name>production_schema_name</schema.name>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<schema.name>test_schema_name</schema.name>
</properties>
</profile>
</profiles>
@Table(name = "VALUES", schema = "DEV").
@Table(name = "VALUES", schema = "PROD").
@Profile
@Column (length = 2000)
private String message;
@Lob