fix conflicts
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.baeldung</groupId>
|
||||
<artifactId>duckdb</artifactId>
|
||||
<name>duckdb</name>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<configuration>
|
||||
<source>9</source>
|
||||
<target>9</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>persistence-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<duckdb.version>0.10.0</duckdb.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.duckdb</groupId>
|
||||
<artifactId>duckdb_jdbc</artifactId>
|
||||
<version>${duckdb.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,198 @@
|
||||
package com.baeldung;
|
||||
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.sql.Connection;
|
||||
import java.sql.DriverManager;
|
||||
import java.sql.PreparedStatement;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.ResultSetMetaData;
|
||||
import java.sql.SQLException;
|
||||
import java.sql.Statement;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
|
||||
|
||||
|
||||
class DuckDbAccessIntegrationTest {
|
||||
|
||||
private Connection conn = null;
|
||||
private Statement stmt = null;
|
||||
|
||||
@BeforeAll
|
||||
static void setupOnce() throws Exception {
|
||||
Class.forName("org.duckdb.DuckDBDriver");
|
||||
}
|
||||
|
||||
@BeforeEach
|
||||
void setup() throws SQLException {
|
||||
conn = DriverManager.getConnection("jdbc:duckdb:");
|
||||
stmt = conn.createStatement();
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenQueryCurrentDate_thenReturnToday() throws SQLException {
|
||||
ResultSet rs = stmt.executeQuery("SELECT current_date");
|
||||
Date currentDate = rs.next() ? rs.getDate(1) : null;
|
||||
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.set(Calendar.HOUR_OF_DAY, 0);
|
||||
calendar.set(Calendar.MINUTE, 0);
|
||||
calendar.set(Calendar.SECOND, 0);
|
||||
calendar.set(Calendar.MILLISECOND, 0);
|
||||
Date expectedDate = calendar.getTime();
|
||||
|
||||
assertThat(currentDate).isEqualTo(expectedDate);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenReadCsv_thenReturnHeaderAndData() throws SQLException {
|
||||
String filePath = getResourceAbsolutePath("/customer.csv");
|
||||
String query = String.format("SELECT * FROM read_csv('%s')", filePath);
|
||||
|
||||
ResultSet rs = stmt.executeQuery(query);
|
||||
ResultSetMetaData metadata = rs.getMetaData();
|
||||
|
||||
List<String> actualHeaderNames = new ArrayList<>();
|
||||
for (int n=1; n<=metadata.getColumnCount(); n++) {
|
||||
actualHeaderNames.add(metadata.getColumnLabel(n));
|
||||
}
|
||||
|
||||
// Then
|
||||
List<String> expectedHeaderNames = List.of("CustomerId", "FirstName", "LastName", "Gender");
|
||||
assertThat(actualHeaderNames).isEqualTo(expectedHeaderNames);
|
||||
|
||||
int rowCount = 0;
|
||||
while (rs.next()) {
|
||||
rowCount++;
|
||||
}
|
||||
assertThat(rowCount).isEqualTo(10);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenImportByCsv_thenReturnCorrectRowCount() throws SQLException {
|
||||
// When
|
||||
String filePath = getResourceAbsolutePath("/customer.csv");
|
||||
String query = String.format("CREATE TABLE customer AS SELECT * FROM read_csv('%s')", filePath);
|
||||
stmt.executeUpdate(query);
|
||||
|
||||
// Then
|
||||
assertThat(getTableRowCount(conn, "customer")).isEqualTo(10);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenImportByJson_thenReturnCorrectRowCount() throws SQLException {
|
||||
// When
|
||||
String filePath = getResourceAbsolutePath("/product.json");
|
||||
String query = String.format("CREATE TABLE product AS SELECT * FROM read_json('%s')", filePath);
|
||||
stmt.executeUpdate(query);
|
||||
|
||||
// Then
|
||||
assertThat(getTableRowCount(conn, "product")).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenImportByInsert_thenReturnCorrectRowCount() throws SQLException {
|
||||
// When
|
||||
stmt.executeUpdate("CREATE TABLE purchase(customerId BIGINT, productId BIGINT)");
|
||||
|
||||
String query = "INSERT INTO purchase(customerId, productId) VALUES (?,?)";
|
||||
try (PreparedStatement pStmt = conn.prepareStatement(query)) {
|
||||
|
||||
pStmt.setInt(1, 101);
|
||||
pStmt.setInt(2, 1);
|
||||
pStmt.addBatch();
|
||||
|
||||
pStmt.setInt(1, 101);
|
||||
pStmt.setInt(2, 2);
|
||||
pStmt.addBatch();
|
||||
|
||||
pStmt.setInt(1, 102);
|
||||
pStmt.setInt(2, 2);
|
||||
pStmt.addBatch();
|
||||
|
||||
pStmt.executeBatch();
|
||||
}
|
||||
|
||||
// Then
|
||||
assertThat(getTableRowCount(conn, "purchase")).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenQueryWithJoin_thenReturnCorrectCount() throws SQLException {
|
||||
String customerFilePath = getResourceAbsolutePath("/customer.csv");
|
||||
String productFilePath = getResourceAbsolutePath("/product.json");
|
||||
whenImportByInsert_thenReturnCorrectRowCount();
|
||||
|
||||
String query = String.format("SELECT C.firstName, C.lastName, P.productName " +
|
||||
"FROM read_csv('%s') AS C, read_json('%s') AS P, purchase S " +
|
||||
"WHERE S.customerId = C.customerId " +
|
||||
"AND S.productId = P.productId ",
|
||||
customerFilePath, productFilePath);
|
||||
|
||||
int count = 0;
|
||||
ResultSet rs = stmt.executeQuery(query);
|
||||
while (rs.next()) {
|
||||
count++;
|
||||
}
|
||||
|
||||
assertThat(count).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void whenExportData_thenFileIsCreated() throws IOException, SQLException {
|
||||
createPurchaseView(conn);
|
||||
|
||||
File tempFile = File.createTempFile("temp", "");
|
||||
String exportFilePath = tempFile.getAbsolutePath();
|
||||
String query = String.format("COPY purchase_view TO '%s'", exportFilePath);
|
||||
stmt.executeUpdate(query);
|
||||
|
||||
assertThat(tempFile.length()).isGreaterThan(0);
|
||||
tempFile.delete();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void tearDown() throws SQLException {
|
||||
stmt.close();
|
||||
conn.close();
|
||||
}
|
||||
|
||||
private String getResourceAbsolutePath(String name) {
|
||||
return this.getClass().getResource(name).getPath().replaceFirst("/", "");
|
||||
}
|
||||
|
||||
private int getTableRowCount(Connection conn, String tableName) throws SQLException {
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
ResultSet rs = stmt.executeQuery(String.format("SELECT COUNT(*) FROM %s", tableName));
|
||||
return (rs.next()) ? rs.getInt(1) : 0;
|
||||
}
|
||||
}
|
||||
|
||||
private void createPurchaseView(Connection conn) throws SQLException {
|
||||
whenImportByCsv_thenReturnCorrectRowCount();
|
||||
whenImportByJson_thenReturnCorrectRowCount();
|
||||
whenImportByInsert_thenReturnCorrectRowCount();
|
||||
|
||||
String query = "CREATE VIEW purchase_view AS " +
|
||||
"SELECT P.productName, COUNT(*) AS purchaseCount " +
|
||||
"FROM customer C, product P, purchase S " +
|
||||
"WHERE S.customerId = C.customerId " +
|
||||
"AND S.productId = P.productId " +
|
||||
"GROUP BY P.productName " +
|
||||
"ORDER BY COUNT(*) DESC ";
|
||||
|
||||
try (Statement stmt = conn.createStatement()) {
|
||||
stmt.executeUpdate(query);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
CustomerId,FirstName,LastName,Gender
|
||||
101,John,Smith,Male
|
||||
102,Sarah,Jones,Female
|
||||
103,Michael,Johnson,Male
|
||||
104,Emily,Davis,Female
|
||||
105,David,Brown,Male
|
||||
106,Emma,Williams,Female
|
||||
107,Alexander,Miller,Male
|
||||
108,Samantha,Anderson,Female
|
||||
109,Matthew,Taylor,Male
|
||||
110,Olivia,Thompson,Female
|
||||
|
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"productId": 1,
|
||||
"productName":"EZ Curl Bar",
|
||||
"category": "Sports Equipment"
|
||||
},
|
||||
{
|
||||
"productId": 2,
|
||||
"productName": "7' Barbell",
|
||||
"category": "Sports Equipment"
|
||||
},
|
||||
{
|
||||
"productId": 3,
|
||||
"productName": "Single Mouthguard - Black",
|
||||
"category": "Sports Equipment"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,6 @@
|
||||
## Hibernate Annotations
|
||||
|
||||
This module contains articles about Annotations used in Hibernate.
|
||||
|
||||
### Relevant Articles:
|
||||
- [@Subselect Annotation in Hibernate](https://www.baeldung.com/hibernate-subselect)
|
||||
@@ -0,0 +1,109 @@
|
||||
<?xml version="1.0"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<artifactId>hibernate-annotations-2</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<name>hibernate-annotations-2</name>
|
||||
<packaging>jar</packaging>
|
||||
<description>Hibernate annotations module, part 2</description>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>persistence-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<!-- Spring -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-jpa</artifactId>
|
||||
<version>${org.springframework.data.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.orm</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>${hibernate-core.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hsqldb</groupId>
|
||||
<artifactId>hsqldb</artifactId>
|
||||
<version>${hsqldb.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.h2database</groupId>
|
||||
<artifactId>h2</artifactId>
|
||||
<version>${h2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-lang3</artifactId>
|
||||
<version>${commons-lang3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.orm</groupId>
|
||||
<artifactId>hibernate-testing</artifactId>
|
||||
<version>${hibernate-core.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.hibernate.orm</groupId>
|
||||
<artifactId>hibernate-spatial</artifactId>
|
||||
<version>${hibernate-core.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat</groupId>
|
||||
<artifactId>tomcat-dbcp</artifactId>
|
||||
<version>${tomcat-dbcp.version}</version>
|
||||
</dependency>
|
||||
<!-- validation -->
|
||||
<!-- utils -->
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
<!-- test scoped -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-test</artifactId>
|
||||
<version>${org.springframework.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.hypersistence</groupId>
|
||||
<artifactId>hypersistence-utils-hibernate-60</artifactId>
|
||||
<version>${hypersistance-utils-hibernate-60.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.liquibase</groupId>
|
||||
<artifactId>liquibase-core</artifactId>
|
||||
<version>${liquibase-core.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<!-- Spring -->
|
||||
<org.springframework.version>6.0.6</org.springframework.version>
|
||||
<org.springframework.data.version>3.0.3</org.springframework.data.version>
|
||||
<hibernate-core.version>6.4.2.Final</hibernate-core.version>
|
||||
<maven.deploy.skip>true</maven.deploy.skip>
|
||||
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
|
||||
<hypersistance-utils-hibernate-60.version>3.3.1</hypersistance-utils-hibernate-60.version>
|
||||
<lombok.version>1.18.30</lombok.version>
|
||||
<liquibase-core.version>4.24.0</liquibase-core.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
+50
@@ -0,0 +1,50 @@
|
||||
package com.baeldung.hibernate;
|
||||
|
||||
import com.baeldung.hibernate.subselect.RuntimeConfiguration;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.boot.Metadata;
|
||||
import org.hibernate.boot.MetadataSources;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.service.ServiceRegistry;
|
||||
|
||||
public class HibernateAnnotationUtil {
|
||||
|
||||
private static final SessionFactory SESSION_FACTORY = buildSessionFactory();
|
||||
|
||||
/**
|
||||
* Utility class
|
||||
*/
|
||||
private HibernateAnnotationUtil() {
|
||||
}
|
||||
|
||||
public static SessionFactory getSessionFactory() {
|
||||
return SESSION_FACTORY;
|
||||
}
|
||||
|
||||
private static SessionFactory buildSessionFactory() {
|
||||
ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
|
||||
.applySettings(dbSettings())
|
||||
.build();
|
||||
|
||||
Metadata metadata = new MetadataSources(serviceRegistry)
|
||||
.addAnnotatedClass(RuntimeConfiguration.class)
|
||||
.buildMetadata();
|
||||
|
||||
return metadata.buildSessionFactory();
|
||||
}
|
||||
|
||||
private static Map<String, Object> dbSettings() {
|
||||
Map<String, Object> dbSettings = new HashMap<>();
|
||||
dbSettings.put(Environment.URL, "jdbc:h2:mem:spring_hibernate_one_to_many");
|
||||
dbSettings.put(Environment.USER, "sa");
|
||||
dbSettings.put(Environment.PASS, "");
|
||||
dbSettings.put(Environment.DRIVER, "org.h2.Driver");
|
||||
dbSettings.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, "thread");
|
||||
dbSettings.put(Environment.SHOW_SQL, "true");
|
||||
dbSettings.put(Environment.HBM2DDL_AUTO, "create");
|
||||
return dbSettings;
|
||||
}
|
||||
}
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
package com.baeldung.hibernate;
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import java.util.Properties;
|
||||
import javax.sql.DataSource;
|
||||
import org.apache.tomcat.dbcp.dbcp2.BasicDataSource;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.ComponentScan;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.context.annotation.PropertySource;
|
||||
import org.springframework.core.env.Environment;
|
||||
import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor;
|
||||
import org.springframework.orm.hibernate5.HibernateTransactionManager;
|
||||
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
import org.springframework.transaction.annotation.EnableTransactionManagement;
|
||||
|
||||
@Configuration
|
||||
@EnableTransactionManagement
|
||||
@PropertySource({ "classpath:persistence-h2.properties" })
|
||||
public class PersistenceConfig {
|
||||
|
||||
@Autowired
|
||||
private Environment env;
|
||||
|
||||
@Bean
|
||||
public LocalSessionFactoryBean sessionFactory() {
|
||||
final LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
|
||||
sessionFactory.setDataSource(dataSource());
|
||||
sessionFactory.setPackagesToScan(new String[] { "com.baeldung.hibernate" });
|
||||
sessionFactory.setHibernateProperties(hibernateProperties());
|
||||
return sessionFactory;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public DataSource dataSource() {
|
||||
final BasicDataSource dataSource = new BasicDataSource();
|
||||
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
|
||||
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
|
||||
dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
|
||||
dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));
|
||||
|
||||
return dataSource;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PlatformTransactionManager hibernateTransactionManager() {
|
||||
final HibernateTransactionManager transactionManager = new HibernateTransactionManager();
|
||||
transactionManager.setSessionFactory(sessionFactory().getObject());
|
||||
return transactionManager;
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
|
||||
return new PersistenceExceptionTranslationPostProcessor();
|
||||
}
|
||||
|
||||
private final Properties hibernateProperties() {
|
||||
final Properties hibernateProperties = new Properties();
|
||||
hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
|
||||
hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
|
||||
hibernateProperties.setProperty("hibernate.show_sql", "false");
|
||||
return hibernateProperties;
|
||||
}
|
||||
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
# jdbc.X
|
||||
jdbc.driverClassName=org.h2.Driver
|
||||
jdbc.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
|
||||
jdbc.eventGeneratedId=sa
|
||||
jdbc.user=sa
|
||||
jdbc.pass=
|
||||
|
||||
# hibernate.X
|
||||
hibernate.dialect=org.hibernate.dialect.H2Dialect
|
||||
hibernate.show_sql=false
|
||||
hibernate.hbm2ddl.auto=create-drop
|
||||
hibernate.cache.use_second_level_cache=true
|
||||
hibernate.cache.use_query_cache=true
|
||||
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
|
||||
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package com.baeldung;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.test.context.ContextConfiguration;
|
||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
||||
import org.springframework.test.context.support.AnnotationConfigContextLoader;
|
||||
|
||||
import com.baeldung.hibernate.PersistenceConfig;
|
||||
|
||||
@RunWith(SpringJUnit4ClassRunner.class)
|
||||
@ContextConfiguration(classes = { PersistenceConfig.class }, loader = AnnotationConfigContextLoader.class)
|
||||
public class SpringContextTest {
|
||||
|
||||
@Test
|
||||
public void whenSpringContextIsBootstrapped_thenNoExceptions() {
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
package com.baeldung.hibernate.subselect;
|
||||
|
||||
import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil;
|
||||
import com.baeldung.hibernate.HibernateAnnotationUtil;
|
||||
import jakarta.persistence.criteria.Root;
|
||||
import liquibase.Contexts;
|
||||
import liquibase.LabelExpression;
|
||||
@@ -13,3 +13,4 @@ This module contains articles about Annotations used in Hibernate.
|
||||
- [Hibernate @CreationTimestamp and @UpdateTimestamp](https://www.baeldung.com/hibernate-creationtimestamp-updatetimestamp)
|
||||
- [Difference Between @JoinColumn and @PrimaryKeyJoinColumn in JPA](https://www.baeldung.com/java-jpa-join-vs-primarykeyjoin)
|
||||
- [A Guide to the @SoftDelete Annotation in Hibernate](https://www.baeldung.com/java-hibernate-softdelete-annotation)
|
||||
- [@Subselect Annotation in Hibernate](https://www.baeldung.com/hibernate-subselect)
|
||||
|
||||
-2
@@ -4,7 +4,6 @@ import com.baeldung.hibernate.oneToMany.model.Cart;
|
||||
import com.baeldung.hibernate.oneToMany.model.CartOIO;
|
||||
import com.baeldung.hibernate.oneToMany.model.Item;
|
||||
import com.baeldung.hibernate.oneToMany.model.ItemOIO;
|
||||
import com.baeldung.hibernate.subselect.RuntimeConfiguration;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.boot.Metadata;
|
||||
import org.hibernate.boot.MetadataSources;
|
||||
@@ -39,7 +38,6 @@ public class HibernateAnnotationUtil {
|
||||
.addAnnotatedClass(CartOIO.class)
|
||||
.addAnnotatedClass(Item.class)
|
||||
.addAnnotatedClass(ItemOIO.class)
|
||||
.addAnnotatedClass(RuntimeConfiguration.class)
|
||||
.buildMetadata();
|
||||
|
||||
return metadata.buildSessionFactory();
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
## Hibernate JPA
|
||||
|
||||
This module contains articles specific to use of Hibernate as a JPA implementation, such as Locking, Bootstrapping, One-to-One Relationship, Persistence Context, and more.
|
||||
|
||||
### Relevant articles:
|
||||
|
||||
- [JPA/Hibernate Persistence Context](https://www.baeldung.com/jpa-hibernate-persistence-context)
|
||||
- [Quick Guide to EntityManager#getReference()](https://www.baeldung.com/jpa-entity-manager-get-reference)
|
||||
- [JPA Entities and the Serializable Interface](https://www.baeldung.com/jpa-entities-serializable)
|
||||
- [The @Struct Annotation Type in Hibernate – Structured User-Defined Types](https://www.baeldung.com/java-hibernate-struct-annotation)
|
||||
@@ -1,7 +1,7 @@
|
||||
<?xml version="1.0"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>hibernate-jpa-2</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
@@ -92,4 +92,4 @@
|
||||
<logback.version>1.4.6</logback.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
</project>
|
||||
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
package com.baeldung.hibernate.struct.entities;
|
||||
|
||||
import jakarta.persistence.*;
|
||||
|
||||
@Entity
|
||||
public class StructDepartment {
|
||||
@Id
|
||||
@GeneratedValue
|
||||
private Integer id;
|
||||
|
||||
@Column
|
||||
private String departmentName;
|
||||
|
||||
@Embedded
|
||||
@Column
|
||||
private StructManager manager;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Department{" +
|
||||
"id=" + id +
|
||||
", departmentName='" + departmentName + '\'' +
|
||||
", manager=" + manager +
|
||||
'}';
|
||||
}
|
||||
|
||||
public StructDepartment(String departmentName, StructManager manager) {
|
||||
this.departmentName = departmentName;
|
||||
this.manager = manager;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getDepartmentName() {
|
||||
return departmentName;
|
||||
}
|
||||
|
||||
public void setDepartmentName(String departmentName) {
|
||||
this.departmentName = departmentName;
|
||||
}
|
||||
|
||||
public StructManager getManager() {
|
||||
return manager;
|
||||
}
|
||||
|
||||
public void setManager(StructManager manager) {
|
||||
this.manager = manager;
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
package com.baeldung.hibernate.struct.entities;
|
||||
import jakarta.persistence.Embeddable;
|
||||
import org.hibernate.annotations.Struct;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Embeddable
|
||||
@Struct(name = "Department_Manager_Type", attributes = {"firstName", "lastName", "qualification"})
|
||||
public class StructManager implements Serializable {
|
||||
private String firstName;
|
||||
private String lastName;
|
||||
private String qualification;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Manager{" +
|
||||
"firstName='" + firstName + '\'' +
|
||||
", lastName='" + lastName + '\'' +
|
||||
", qualification='" + qualification + '\'' +
|
||||
'}';
|
||||
}
|
||||
|
||||
public StructManager(String firstName, String lastName, String qualification) {
|
||||
this.firstName = firstName;
|
||||
this.lastName = lastName;
|
||||
this.qualification = qualification;
|
||||
}
|
||||
|
||||
public String getFirstName() {
|
||||
return firstName;
|
||||
}
|
||||
|
||||
public void setFirstName(String firstName) {
|
||||
this.firstName = firstName;
|
||||
}
|
||||
|
||||
public String getLastName() {
|
||||
return lastName;
|
||||
}
|
||||
|
||||
public void setLastName(String lastName) {
|
||||
this.lastName = lastName;
|
||||
}
|
||||
|
||||
public String getQualification() {
|
||||
return qualification;
|
||||
}
|
||||
|
||||
public void setQualification(String qualification) {
|
||||
this.qualification = qualification;
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user