@MappedSuperclass public class Employee { @Id protected Integer empId; @Version protected Integer version; @ManyToOne @JoinColumn(name="ADDR") protected Address address; public Integer getEmpId() { ... } public void setEmpId(Integer id) { ... } public Address getAddress() { ... } public void setAddress(Address addr) { ... } }Employee entity'ler için bir super class'dır. Aşağıda Employee'den türeyen iki entity class'î görülmektedir :
@Entity public class FTEmployee extends Employee { // Inherited empId field mapped to FTEMPLOYEE.EMPID // Inherited version field mapped to FTEMPLOYEE.VERSION // Inherited address field mapped to FTEMPLOYEE.ADDR fk // Defaults to FTEMPLOYEE.SALARY protected Integer salary; public FTEmployee() {} public Integer getSalary() { ... } public void setSalary(Integer salary) { ... } } @Entity @Table(name="PT_EMP") @AssociationOverride(name="address", joincolumns=@JoinColumn(name="ADDR_ID")) public class PartTimeEmployee extends Employee { // Inherited empId field mapped to PT_EMP.EMPID // Inherited version field mapped to PT_EMP.VERSION // address field mapping overridden to PT_EMP.ADDR_ID fk @Column(name="WAGE") protected Float hourlyWage; public PartTimeEmployee() {} public Float getHourlyWage() { ... } public void setHourlyWage(Float wage) { ... } }
public class Cart { // This state is transient Integer operationCount; public Cart() { operationCount = 0; } public Integer getOperationCount() { return operationCount; } public void incrementOperationCount() { operationCount++; } }Yukarıdaki normal sınıfı extend eden Entity sınıfı :
@Entity public class ShoppingCart extends Cart { Collection items = new Vector(); public ShoppingCart() { super(); } @OneToMany public Collection getItems() { return items; } public void addItem(Item item) { items.add(item); incrementOperationCount(); } }
class MessageCount{ Long memberId; Long count; public MessageCount(Long memberId,Long count){ setMemberId(memberId); setCount(count); } // set ve get aşağıda.... ... }Ve select sorgusunu aşağıdaki gibi yazabilirsiniz :
select new MessageCount(m.memberid,count(m.memberid)) from Message m group by m.memberid;Ve bu sorgu sonucunu aşağıdaki gibi alabilirsiniz :
String query="select new MessageCount(m.memberid, count(m.memberid)) from Message m group by m.memberid;"; Query query=getEntityManager().createQuery(query); List list=query.getResultList();
not found on type org.hibernate.collection.PersistentSetBu sorunu çözmek için data componentine (datatable,repeater vb..) Set yerine List tipi verilmelidir. Bunun için entity'ye aşağıdaki gibi bir fonksiyon eklenebilir :
@Transient public List geXAsList() { List list = new ArrayList(X); return list; }
@MappedSuperclass public class BaseEntity{ @Temporal(TemporalType.TIMESTAMP) @Column(name = "creation_date") private Calendar creationDate; }Yukarıdaki örnekte yaratılma tarihi özelliği genel bir özellik gibi tanımlanmıştır. Aşağıda bu class'ı extend eden entity class'ı görülmektedir:
@Entity public class Test extends BaseEntity { @Column(name = "name") private String name; }
public class EntityBase{ ... } @Entity public class Entity1 extend EntityBase{ } @Entity public class Entity2 extend EntityBase{ }
class A{ @ManyToOne @JoinColumn(name="b_id") B b; } class B{ @OneToMany(mappedBy="b") List aList; }
<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.6.Final</version> </dependency> <!-- https://mvnrepository.com/artifact/org.hsqldb/hsqldb --> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <version>2.3.4</version> </dependency>persistence.xml aşağıdaki gibi olacak:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="TestJPA" transaction-type="RESOURCE_LOCAL"> <description>JPA Test</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>com.test.entity.Test</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver" /> <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:unittests" /> <property name="javax.persistence.jdbc.user" value="sa" /> <property name="javax.persistence.jdbc.password" value="" /> </properties> </persistence-unit> </persistence>Artık JPA ile veritabanına erişebiliriz. Aşağıdaki gibi test edilebilir :
EntityManagerFactory entityManagerFactory= Persistence.createEntityManagerFactory("TestJPA",map); EntityManager entityManager=entityManagerFactory.createEntityManager(); Test t=new Test(); t.setId(1); t.setName("Ali"); entityManager.getTransaction().begin(); entityManager.persist(t); entityManager.getTransaction().commit(); entityManager.close(); entityManagerFactory.close();
Map map = new HashMap(); map.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect"); map.put("hibernate.hbm2ddl.auto", "create-drop"); map.put("hibernate.show_sql", "true"); map.put("javax.persistence.jdbc.driver", "org.hsqldb.jdbcDriver"); map.put("javax.persistence.jdbc.url", "jdbc:hsqldb:mem:unittests"); map.put("javax.persistence.jdbc.user", "sa"); map.put("javax.persistence.jdbc.password", "sa"); EntityManagerFactory entityManagerFactory= Persistence.createEntityManagerFactory("TestJPA",map); EntityManager entityManager=entityManagerFactory.createEntityManager(); Test t=new Test(); t.setId(1); t.setName("Ali"); entityManager.getTransaction().begin(); entityManager.persist(t); entityManager.getTransaction().commit(); entityManager.close(); entityManagerFactory.close();Bu örnekte persistence.xml aşağıdaki gibi olması yeterlidir:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="TestJPA" transaction-type="RESOURCE_LOCAL"> <description>JPA Test</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>com.test.entity.Test</class> </persistence-unit> </persistence>provider ve transactipon type de eklenebilir :
map.put("javax.persistence.provider", "org.hibernate.jpa.HibernatePersistenceProvider"); map.put("javax.persistence.transactionType", "RESOURCE_LOCAL");ve persistence.xml sadece aşağıdaki gibi olabilir:
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"> <persistence-unit name="TestJPA"> <class>com.test.entity.Test</class> </persistence-unit> </persistence>
import javax.persistence.EntityManager; import javax.persistence.Persistence; public class GenericDao<T,PK> { private EntityManager entityManager; public GenericDao() { entityManager = Persistence.createEntityManagerFactory("TestJPA").createEntityManager(); } public Test find(Long id) { return entityManager.find(entityClass, id); // hata } public void create(Test t) { entityManager.persist(t); } public void update(Test t) { entityManager.merge(t); } public void delete(Test t) { entityManager.remove(t); } }Yukarıdaki kod derlenemez. entityManager.find(entityClass, id) satırında T'nin sınıfı gerekmektedir. Generic bir değişkenin sınıfını o anda alamazsınız. T'nin sınıfını almak için T sınıfı için kurucuda bir Class değişkeni yaratılabilir ve aşağıdaki gibi yaratılabilir :
import java.lang.reflect.ParameterizedType; import javax.persistence.EntityManager; import javax.persistence.Persistence; public class GenericDao<T, PK> { private EntityManager entityManager; protected Class<T> entityClass; public GenericDao() { entityManager = Persistence.createEntityManagerFactory("TestJPA").createEntityManager(); ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0]; } public T find(Long id) { return entityManager.find(entityClass, id); // hata } public void create(T t) { entityManager.persist(t); } public void update(T t) { entityManager.merge(t); } public void delete(T t) { entityManager.remove(t); } }Görüldüğü gibi kurucuda
ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassFile(ClassFileArchiveEntryHandler.java:64) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:47) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:152) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.bu hatayı çözmek için javassist projesinin son versiyonuna geçmeniz gerekebilir:(EntityManagerFactoryBuilderImpl.java:199) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:114) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:71) ~[scheduler-0.0.1-SNAPSHOT.jar:?] at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:52) [scheduler-0.0.1-SNAPSHOT.jar:?] at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) [scheduler-0.0.1-SNAPSHOT.jar:?] .. javax.persistence.PersistenceException: Unable to build entity manager factory at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:66) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) .. at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) Caused by: org.hibernate.boot.archive.spi.ArchiveException: Could not build ClassFile at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.toClassFile(ClassFileArchiveEntryHandler.java:64) at org.hibernate.boot.archive.scan.spi.ClassFileArchiveEntryHandler.handleEntry(ClassFileArchiveEntryHandler.java:47) at org.hibernate.boot.archive.internal.JarFileBasedArchiveDescriptor.visitArchive(JarFileBasedArchiveDescriptor.java:152) at org.hibernate.boot.archive.scan.spi.AbstractScannerImpl.scan(AbstractScannerImpl.java:47) at org.hibernate.boot.model.process.internal.ScanningCoordinator.coordinateScan(ScanningCoordinator.java:75) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.prepare(MetadataBuildingProcess.java:98) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl. (EntityManagerFactoryBuilderImpl.java:199) at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:114) at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:71) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:52)
<dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.25.0-GA</version> </dependency>