Hibernate: Difference between revisions
Jump to navigation
Jump to search
Line 141: | Line 141: | ||
System.out.println("Tomorrow Min: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusDays(1L)); | 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).plusDays(2L).minusNanos(1L)); | ||
System.out.println("Tomorrow | System.out.println("Tomorrow Max: " + LocalDateTime.now().truncatedTo(ChronoUnit.DAYS).plusHours(48).minusNanos(1L)); | ||
} | } | ||
} | } |
Revision as of 09:07, 18 January 2022
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));
}
}