这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions persistence-modules/hibernate-mapping-2/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ This module contains articles about Hibernate Mappings.

### Relevant articles

- [Hibernate Many to Many Annotation Tutorial](https://www.baeldung.com/hibernate-many-to-many)
- [Boolean Converters in Hibernate 6](https://www.baeldung.com/java-hibernate-6-boolean-converters)
- [Generate UUIDs as Primary Keys With Hibernate](https://www.baeldung.com/java-hibernate-uuid-primary-key)
- [Understanding JPA/Hibernate Associations](https://www.baeldung.com/jpa-hibernate-associations)
- [Mapping LOB Data in Hibernate](https://www.baeldung.com/hibernate-lob)
- [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps)
- [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints)
- [Mapping A Hibernate Query to a Custom Class](https://www.baeldung.com/hibernate-query-to-custom-class)
- [Dynamic Mapping with Hibernate](https://www.baeldung.com/hibernate-dynamic-mapping)
- [FetchMode in Hibernate](https://www.baeldung.com/hibernate-fetchmode)
70 changes: 41 additions & 29 deletions persistence-modules/hibernate-mapping-2/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -14,57 +14,69 @@
</parent>

<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- persistence -->
<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.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>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>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
<dependency>
<groupId>javax.money</groupId>
<artifactId>money-api</artifactId>
<version>${money-api.version}</version>
</dependency>
<dependency>
<groupId>org.javamoney</groupId>
<artifactId>moneta</artifactId>
<version>${moneta.version}</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.openjdk.nashorn</groupId>
<artifactId>nashorn-core</artifactId>
<version>${nashorn-core.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.expressly</groupId>
<artifactId>expressly</artifactId>
<version>${expressly.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>
<!-- persistence -->
<tomcat-dbcp.version>9.0.0.M26</tomcat-dbcp.version>
<com.sun.xml.version>4.0.2</com.sun.xml.version>
<h2.version>2.1.214</h2.version>
<money-api.version>1.1</money-api.version>
<moneta.version>1.4.2</moneta.version>
<hibernate-validator.version>8.0.1.Final</hibernate-validator.version>
<nashorn-core.version>15.4</nashorn-core.version>
<expressly.version>5.0.0</expressly.version>
</properties>

</project>
Original file line number Diff line number Diff line change
@@ -1,58 +1,97 @@
package com.baeldung.hibernate;

import static org.hibernate.boot.registry.StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Properties;

import org.apache.commons.lang3.StringUtils;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baeldung.hibernate.booleanconverters.model.Question;
import com.baeldung.hibernate.manytomany.model.Employee;
import com.baeldung.hibernate.manytomany.model.Project;
import com.baeldung.hibernate.uuids.WebSiteUser;
import com.baeldung.hibernate.uuids.Element;
import com.baeldung.hibernate.uuids.Reservation;
import com.baeldung.hibernate.uuids.Sale;
import com.baeldung.hibernate.entities.DeptEmployee;
import com.baeldung.hibernate.pojo.Employee;
import com.baeldung.hibernate.pojo.EntityDescription;
import com.baeldung.hibernate.pojo.Phone;

public class HibernateUtil {

private static final String DEFAULT_RESOURCE = "manytomany.cfg.xml";
private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class);
private static String PROPERTY_FILE_NAME;
private HibernateUtil() {
}

public static SessionFactory getSessionFactory() throws IOException {
return getSessionFactory("");
}

public static SessionFactory getSessionFactory(String propertyFileName) throws IOException {
if(propertyFileName.equals("")) propertyFileName = null;
PROPERTY_FILE_NAME = propertyFileName;
ServiceRegistry serviceRegistry = configureServiceRegistry();
return makeSessionFactory(serviceRegistry);
}

private static SessionFactory buildSessionFactory(String resource) {
public static SessionFactory getSessionFactory(Strategy strategy) {
return buildSessionFactory(strategy);
}

private static SessionFactory buildSessionFactory(Strategy strategy) {
try {
// Create the SessionFactory from hibernate-annotation.cfg.xml
Configuration configuration = new Configuration();
configuration.addAnnotatedClass(Employee.class);
configuration.addAnnotatedClass(Project.class);
configuration.addAnnotatedClass(WebSiteUser.class);
configuration.addAnnotatedClass(Element.class);
configuration.addAnnotatedClass(Reservation.class);
configuration.addAnnotatedClass(Sale.class);
configuration.addAnnotatedClass(Question.class);
configuration.addPackage(Question.class.getPackageName());
configuration.configure(resource);
LOGGER.debug("Hibernate Annotation Configuration loaded");

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
.build();
LOGGER.debug("Hibernate Annotation serviceRegistry created");

return configuration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
LOGGER.error("Initial SessionFactory creation failed.", ex);
ServiceRegistry serviceRegistry = configureServiceRegistry();

MetadataSources metadataSources = new MetadataSources(serviceRegistry);

for (Class<?> entityClass : strategy.getEntityClasses()) {
metadataSources.addAnnotatedClass(entityClass);
}

Metadata metadata = metadataSources.getMetadataBuilder()
.build();

return metadata.getSessionFactoryBuilder()
.build();
} catch (IOException ex) {
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return buildSessionFactory(DEFAULT_RESOURCE);
private static SessionFactory makeSessionFactory(ServiceRegistry serviceRegistry) {
MetadataSources metadataSources = new MetadataSources(serviceRegistry);

metadataSources.addPackage("com.baeldung.hibernate.pojo");
metadataSources.addAnnotatedClass(Employee.class);
metadataSources.addAnnotatedClass(Phone.class);
metadataSources.addAnnotatedClass(EntityDescription.class);
metadataSources.addAnnotatedClass(DeptEmployee.class);
metadataSources.addAnnotatedClass(com.baeldung.hibernate.entities.Department.class);

Metadata metadata = metadataSources.getMetadataBuilder()
.build();

return metadata.getSessionFactoryBuilder()
.build();

}


private static ServiceRegistry configureServiceRegistry() throws IOException {
Properties properties = getProperties();
return new StandardServiceRegistryBuilder().applySettings(properties)
.build();
}

public static SessionFactory getSessionFactory(String resource) {
return buildSessionFactory(resource);
private static Properties getProperties() throws IOException {
Properties properties = new Properties();
URL propertiesURL = Thread.currentThread()
.getContextClassLoader()
.getResource(StringUtils.defaultString(PROPERTY_FILE_NAME, "hibernate.properties"));
try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) {
properties.load(inputStream);
}
return properties;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.baeldung.hibernate;


import java.util.Arrays;
import java.util.List;

public enum Strategy {
//See that the classes belongs to different packages
MAP_KEY_COLUMN_BASED(Arrays.asList(com.baeldung.hibernate.persistmaps.mapkeycolumn.Order.class,
com.baeldung.hibernate.basicannotation.Course.class)),
MAP_KEY_BASED(Arrays.asList(com.baeldung.hibernate.persistmaps.mapkey.Item.class,
com.baeldung.hibernate.persistmaps.mapkey.Order.class,com.baeldung.hibernate.persistmaps.mapkey.User.class)),
MAP_KEY_JOIN_COLUMN_BASED(Arrays.asList(com.baeldung.hibernate.persistmaps.mapkeyjoincolumn.Seller.class,
com.baeldung.hibernate.persistmaps.mapkeyjoincolumn.Item.class,
com.baeldung.hibernate.persistmaps.mapkeyjoincolumn.Order.class)),
MAP_KEY_ENUMERATED_BASED(Arrays.asList(com.baeldung.hibernate.persistmaps.mapkeyenumerated.Order.class,
com.baeldung.hibernate.persistmaps.mapkey.Item.class)),
MAP_KEY_TEMPORAL_BASED(Arrays.asList(com.baeldung.hibernate.persistmaps.mapkeytemporal.Order.class,
com.baeldung.hibernate.persistmaps.mapkey.Item.class));


private List<Class<?>> entityClasses;

Strategy(List<Class<?>> entityClasses) {
this.entityClasses = entityClasses;
}

public List<Class<?>> getEntityClasses() {
return entityClasses;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.baeldung.hibernate.basicannotation;

import jakarta.persistence.Basic;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;

@Entity
public class Course {

@Id
private int id;

@Basic(optional = false, fetch = FetchType.LAZY)
private String name;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.baeldung.hibernate.booleanconverters;


import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baeldung.hibernate.booleanconverters.model.Question;


public class HibernateUtil {

private static final String DEFAULT_RESOURCE = "manytomany.cfg.xml";
private static final Logger LOGGER = LoggerFactory.getLogger(HibernateUtil.class);

private static SessionFactory buildSessionFactory(String resource) {
try {
// Create the SessionFactory from hibernate-annotation.cfg.xml
Configuration configuration = new Configuration();
configuration.addAnnotatedClass(Question.class);
configuration.addPackage(Question.class.getPackageName());
configuration.configure(resource);
LOGGER.debug("Hibernate Annotation Configuration loaded");

ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties())
.build();
LOGGER.debug("Hibernate Annotation serviceRegistry created");

return configuration.buildSessionFactory(serviceRegistry);
} catch (Throwable ex) {
LOGGER.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}

public static SessionFactory getSessionFactory() {
return buildSessionFactory(DEFAULT_RESOURCE);
}

public static SessionFactory getSessionFactory(String resource) {
return buildSessionFactory(resource);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,11 @@

import java.util.List;

import jakarta.persistence.*;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;

@Entity
public class Department {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.baeldung.hibernate.fetchMode;

import java.util.HashSet;
import java.util.Set;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.OneToMany;
import java.util.HashSet;
import java.util.Set;

@Entity
public class Customer {
Expand Down
Loading