JPA

From Chorke Wiki
Jump to navigation Jump to search

Replacements

java.util.Date     => java.time.Instant
java.sql.Timestamp => java.time.Instant
java.sql.Date      => java.time.LocalDate
java.sql.Time      => java.time.LocalTime

The Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds (up to nine (9) digits of a decimal fraction).All three java.time.Local… classes are all lacking any concept of time zone or offset-from-UTC.

Sequence Style

@Id
@Column(name = "code", length = 6)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "page_sqn")
//@SequenceGenerator(name = "page_sqn", sequenceName = "page_sqn", initialValue = 60466176, allocationSize = 1)
@GenericGenerator(name  = "page_sqn", strategy = "org.chorke.academia.core.entity.Base36Style", parameters = {
    @Parameter(name = Base36Style.INITIAL_VALUE,   value = Base36Style.DIGIT_6_MIN),
    @Parameter(name = Base36Style.SEQUENCE_NAME,   value = "page_sqn"),
    @Parameter(name = Base36Style.ALLOCATION_SIZE, value = "1"),
})
private String code;
package org.chorke.academia.core.entity;

import java.io.Serializable;
import java.util.Properties;

import org.hibernate.HibernateException;
import org.hibernate.MappingException;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.enhanced.SequenceStyleGenerator;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.type.Type;

public class Base36Style extends SequenceStyleGenerator {
    private static final Logger LOG = LoggerFactory.getLogger(Base36Style.class);
    public static final String ALLOCATION_SIZE = INCREMENT_PARAM;
    public static final String SEQUENCE_NAME   = SEQUENCE_PARAM;
    public static final String INITIAL_VALUE   = INITIAL_PARAM;
    public static final int    RADIX = 36;

    public static final String DIGIT_1_MIN = "0";               //            0 =>             Z
    public static final String DIGIT_2_MIN = "36";              //           10 =>            ZZ
    public static final String DIGIT_3_MIN = "1296";            //          100 =>           ZZZ
    public static final String DIGIT_4_MIN = "46656";           //        1,000 =>         Z,ZZZ
    public static final String DIGIT_5_MIN = "1679616";         //       10,000 =>        ZZ,ZZZ
    public static final String DIGIT_6_MIN = "60466176";        //      100,000 =>       ZZZ,ZZZ
    public static final String DIGIT_7_MIN = "2176782336";      //    1,000,000 =>     Z,ZZZ,ZZZ
    public static final String DIGIT_8_MIN = "78364164096";     //   10,000,000 =>    ZZ,ZZZ,ZZZ
    public static final String DIGIT_9_MIN = "2821109907456";   //  100,000,000 =>   ZZZ,ZZZ,ZZZ
    public static final String DIGIT_X_MIN = "101559956668416"; //1,000,000,000 => Z,ZZZ,ZZZ,ZZZ

    @Override
    public Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException {
        Serializable nextval = super.generate(session, object);
        String base36 = Long.toString((Long) nextval, RADIX);
        LOG.debug("Base36: {}", base36.toUpperCase());
        return base36.toUpperCase();
    }

    @Override
    public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
        super.configure(LongType.INSTANCE, params, serviceRegistry);
    }
}

Challenges

Database Auto Increment Sequence Usable
DB2/LUW
DB2/z
PostgreSQL
Derby
Firebird
H2
HyperSQL
INGRES
Informix
MariaDB
MySQL
Oracle
Sql Server
SQLite
Sybase
Sybase Anywhere

Date Time

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

class Playground {
    public static void main(String[ ] args) {
        System.out.println("Yesterday Min: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(1L));
        System.out.println("Yesterday Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusNanos(1L));
        System.out.println("Yesterday Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(1L).plusDays(1L).minusNanos(1L));
        System.out.println("Yesterday Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).minusDays(1L).plusHours(24).minusNanos(1L));

        System.out.println();
        System.out.println("Today    Min: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS));
        System.out.println("Today    Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusDays(1L).minusNanos(1L));
        System.out.println("Today    Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusHours(24).minusNanos(1L));

        System.out.println();
        System.out.println("Tomorrow Min: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusDays(1L));
        System.out.println("Tomorrow Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusDays(2L).minusNanos(1L));
        System.out.println("Tomorrow Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusHours(48).minusNanos(1L));
    }
}

Knowledge

import org.hibernate.Session;

Session session = (Session) entityManager.getDelegate();
Page<Country> countries = countryRepo.findAll(page);
countries = countries.map(country -> {
    session.evict(country);
    if (ObjectUtils.isEmpty(country.getContinent())) {
        Continent continent = continentRepo.findById(country.getContinentCode());
        country.setContinent(continent);
        return country;
    } else return country;
});

@PersistenceContext
EntityManager entityManager;

if (entityManager.contains(country)) entityManager.detach(country);
//  entityManager.detach(country);

References