Java >> Java tutorial >  >> Tag >> hibernate

En begyndervejledning til Hibernate Types

De grundlæggende kortlægningsbegreber

Når man lærer Hibernate, kan mange lide at hoppe til forældre-barn-foreninger uden at mestre det grundlæggende kortlægning af objektrelationer. Det er meget vigtigt at forstå de grundlæggende kortlægningsregler for individuelle enheder, før du begynder at modellere enhedstilknytninger.

Dvaletyper

En Hibernate-type er en bro mellem en SQL-type og en Java-primitiv/objekttype.


Dette er de typer Hibernate understøtter som standard:

Dvaletype (org.hibernate.type) JDBC-type Java-type
StringType VARCHAR String
MaterializedClob CLOB String
TextType LONGVARCHAR String
CharacterType CHAR tegn eller tegn
BooleanType BIT boolesk eller boolsk
NumericBooleanType INTEGER (f.eks. 0 =falsk og 1 =sand) boolesk eller boolsk
YesNoType CHAR (f.eks. 'N' eller 'n' =falsk og 'Y' eller 'y' =sand) boolesk eller boolsk
TrueFalseType CHAR (f.eks. 'F' eller 'f' =falsk og 'T' eller 't' =sand) boolesk eller boolsk
ByteType TINYINT byte eller byte
ShortType SMALLINT kort eller kort
IntegerType INTEGER int eller heltal
LongType STORT lang eller lang
FloatType FLYDE float eller Float
DoubleType DOBLE dobbelt eller dobbelt
BigIntegerType NUMERISK BigInteger
BigDecimalType NUMERISK BigDecimal
TimestampType TIMESTAMP java.sql.Timestamp eller java.util.Date
TimeType TID java.sql.Time
Datotype DATO java.sql.Date
Kalendertype TIMESTAMP java.util.Calendar eller java.util.GregorianCalendar
Kalendertype DATO java.util.Calendar eller java.util.GregorianCalendar
CurrencyType VARCHAR java.util.Currency
LocaleType VARCHAR java.util.Locale
TimeZoneType VARCHAR java.util.TimeZone
UrlType VARCHAR java.net.URL
KlasseType VARCHAR java.lang.Class
BlobType BLOB java.sql.Blob
ClobType CLOB java.sql.Clob
BinærType VARBINÆR byte[] eller byte[]
BinærType BLOB byte[] eller byte[]
BinærType LONGVARBINARY byte[] eller byte[]
BinærType LONGVARBINARY byte[] eller byte[]
CharArrayType VARCHAR char[] eller Character[]
UUIDBinaryType BINÆR java.util.UUID
UUIDBinaryType CHAR eller VARCHAR java.util.UUID
UUIDBinaryType PostgreSQL UUID java.util.UUID
SerialisableType VARBINÆR Serialiserbar

Du kan altid definere dine egne brugerdefinerede typer, som vi vil se i en fremtidig artikel.

Indlejrede (også kaldet komponenttyper)

Du kan gruppere flere kolonner til en bestemt Java-type, som kan genbruges i hele din domænemodel. Hvis det tilknyttede Java-objekt altid er afhængigt af en ekstern enhed, kan du vælge en indlejrbar type til en sådan domænemodeltilknytning.

Et integrerbart objekt kan indeholde både grundlæggende typer og tilknytningstilknytninger, men det kan aldrig indeholde et @Id. Objektet, der kan integreres, bevares/fjernes sammen med dets ejerende enhed.

Forudsat at vi har følgende SQL-tabel:

CREATE TABLE entity_event
  (
     id           BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
     entity_class VARCHAR(255),
     entity_id    BIGINT,
     message      VARCHAR(255),
     PRIMARY KEY (id)
  );

Vi kunne gruppere entity_class og entity_id til et Embeddable-objekt, som vi vil anvende i to forskellige ejerentities.

Objektet, der kan indlejres, ser sådan ud:

@Embeddable
public class EntityIdentifier implements Serializable {

    @Column(name = "entity_id", nullable = true)
    private Long entityId;

    @Column(name = "entity_class", nullable = true)
    private Class entityClass;

    public EntityIdentifier() {
    }

    public EntityIdentifier(Class entityClass, Long entityId) {
        this.entityClass = entityClass;
        this.entityId = entityId;
    }

    public Class getEntityClass() { return entityClass; }

    public void setEntityClass(Class entityClass) { this.entityClass = entityClass; }

    public Long getEntityId() { return entityId; }

    public void setEntityId(Long entityId) { this.entityId = entityId; }
}

Den tilknyttede enhedstabel vil arve de tilknyttede kolonner med indlejrbare egenskaber.

Enhed

En enhed er Java-ækvivalenten til en SQL-tabelrække. Enheden skal indeholde en @Id-egenskab, der tilknytter den tilknyttede tabel Primary Key.

Applikationslogikken foretager ændringer i Entities-egenskaber og underretter Persistence Context af Entity-tilstandsændringer (vedvarer, flet, fjern). Persistenskonteksten vil derfor oversætte alle Entity-ændringer til SQL-sætninger.

Forudsat at vi har følgende SQL-tabeller:

CREATE TABLE entity_attribute
  (
     id           BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
     entity_class VARCHAR(255),
     entity_id    BIGINT,
     name         VARCHAR(255),
     VALUE        VARCHAR(255),
     PRIMARY KEY (id)
  );
 CREATE TABLE entity_event
  (
     id           BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1),
     entity_class VARCHAR(255),
     entity_id    BIGINT,
     message      VARCHAR(255),
     PRIMARY KEY (id)
  );

Vi kan bruge typen EntityIdentifier Embeddable, da begge tabeller indeholder kolonnerne entity_class og entity_id.

@Entity
@Table(name = "entity_attribute")
public class EntityAttribute {

    @Id
    @GeneratedValue
    private Long id;

    private String name;

    private String value;

    private EntityIdentifier entityIdentifier;

    public Long getId() { return id; }

    public String getName() { return name; }

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

    public String getValue() { return value; }

    public void setValue(String value) { this.value = value; }

    public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }

    public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; }
}

@Entity
@Table(name = "entity_event")
public class EntityEvent {

    @Id
    @GeneratedValue
    private Long id;

    private String message;

    private EntityIdentifier entityIdentifier;

    public Long getId() { return id; }

    public String getMessage() { return message; }

    public void setMessage(String message) { this.message = message; }

    public EntityIdentifier getEntityIdentifier() { return entityIdentifier; }

    public void setEntityIdentifier(EntityIdentifier entityIdentifier) { this.entityIdentifier = entityIdentifier; }
}

Testtid

Vi opretter én EntityEvent og én EntityAttribute for et givent produkt for at se, hvordan Embeddable fortsætter sammen med de ejerende enheder:

@Test
public void testEntityIdentifier() {
	doInTransaction(new TransactionCallable<Void>() {
		@Override
		public Void execute(Session session) {
			Product product = new Product("LCD");
			session.persist(product);
			EntityEvent productEvent = new EntityEvent();
			productEvent.setMessage(String.format("Product %s added", product.getName()));
			productEvent.setEntityIdentifier(new EntityIdentifier(
					product.getClass(),
					product.getId()
			));
			session.persist(productEvent);
			EntityAttribute productAttribute = new EntityAttribute();
			productAttribute.setName("AD_CAMPAIGN");
			productAttribute.setValue("LCD_Sales");
			productAttribute.setEntityIdentifier(new EntityIdentifier(
					product.getClass(),
					product.getId()
			));
			session.persist(productAttribute);
			assertSame(1, session.createQuery("select ea from EntityAttribute ea where ea.entityIdentifier = :entityIdentifier")
					.setParameter("entityIdentifier", new EntityIdentifier(product.getClass(), product.getId()))
					.list().size());
			return null;
		}
	});
}
Query:{[
INSERT INTO product
            (id,
             name)
VALUES      (DEFAULT,
             ?)  
][LCD]} 

Query:{[
INSERT INTO entity_event
            (id,
             entity_class,
             entity_id,
             message)
VALUES      (DEFAULT,
             ?,
             ?,
             ?)  
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,Product LCD added]} 

Query:{[
INSERT INTO entity_attribute
            (id,
             entity_class,
             entity_id,
             name,
             VALUE)
VALUES      (DEFAULT,
             ?,
             ?,
             ?,
             ?)  
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1,AD_CAMPAIGN,LCD_Sales]} 

Query:{[
SELECT entityattr0_.id           AS id1_0_,
       entityattr0_.entity_class AS entity_c2_0_,
       entityattr0_.entity_id    AS entity_i3_0_,
       entityattr0_.name         AS name4_0_,
       entityattr0_.VALUE        AS value5_0_
FROM   entity_attribute entityattr0_
WHERE  entityattr0_.entity_class = ?
       AND entityattr0_.entity_id = ?  
][com.vladmihalcea.hibernate.masterclass.laboratory.entityidentifier.Product,1]}

Konklusion

Der er stadig mange begreber, vi skal dække, før vi forstår enhedsforeninger. Du bør altid tage dig tid til at forstå de grundlæggende begreber, før du hopper til mere avancerede emner. Mit næste indlæg vil handle om Entity Identifiers og alle de tilgængelige generatorteknikker.

  • Kode tilgængelig på GitHub.

Java tag