/* * Hibernate, Relational Persistence for Idiomatic Java * * License: GNU Lesser General Public License (LGPL), version 2.1 or later. * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.userguide.flush; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.OneToMany; import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; import org.junit.Test; import org.jboss.logging.Logger; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; import static org.junit.Assert.assertTrue; /** * @author Vlad Mihalcea */ public class AlwaysFlushTest extends BaseEntityManagerFunctionalTestCase { private static final Logger log = Logger.getLogger( AlwaysFlushTest.class); @Override protected Class<?>[] getAnnotatedClasses() { return new Class<?>[] { Person.class, Phone.class, Advertisement.class }; } @Test public void testFlushSQL() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createNativeQuery("delete from Person").executeUpdate(); }); doInJPA( this::entityManagerFactory, entityManager -> { log.info("testFlushSQL"); //tag::flushing-always-flush-sql-example[] Person person = new Person("John Doe"); entityManager.persist(person); Session session = entityManager.unwrap( Session.class); assertTrue(((Number) session .createSQLQuery("select count(*) from Person") .setFlushMode( FlushMode.ALWAYS) .uniqueResult()).intValue() == 1); //end::flushing-always-flush-sql-example[] }); } @Entity(name = "Person") public static class Person { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "person", cascade = CascadeType.ALL) private List<Phone> phones = new ArrayList<>(); public Person() { } public Person(String name) { this.name = name; } public Long getId() { return id; } public String getName() { return name; } public List<Phone> getPhones() { return phones; } public void addPhone(Phone phone) { phones.add(phone); phone.setPerson(this); } } @Entity(name = "Phone") public static class Phone { @Id @GeneratedValue private Long id; @ManyToOne private Person person; @Column(name = "`number`") private String number; public Phone() { } public Phone(String number) { this.number = number; } public Long getId() { return id; } public String getNumber() { return number; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } } @Entity(name = "Advertisement") public static class Advertisement { @Id @GeneratedValue private Long id; private String title; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } } }