Skip to content

Instantly share code, notes, and snippets.

@MonkeyDAntoine
Last active February 8, 2019 15:29
Show Gist options
  • Select an option

  • Save MonkeyDAntoine/f0754bbd5f09b1144427df1bb63afb96 to your computer and use it in GitHub Desktop.

Select an option

Save MonkeyDAntoine/f0754bbd5f09b1144427df1bb63afb96 to your computer and use it in GitHub Desktop.

Revisions

  1. MonkeyDAntoine revised this gist Feb 8, 2019. 1 changed file with 14 additions and 0 deletions.
    14 changes: 14 additions & 0 deletions PersistMap.java
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,17 @@
    /*
    CREATE TABLE `registrable_metadata` (
    `owner` bigint(20) NOT NULL,
    `name` varchar(255) NOT NULL,
    `value` varchar(255) DEFAULT NULL,
    primary key (owner, name)
    );
    create table registrable_seq (
    next_val bigint null
    );
    */
    package com.wl.mts.tt.cm.id.issuer.connector.registry.data;

    import java.io.Serializable;
  2. MonkeyDAntoine created this gist Feb 8, 2019.
    68 changes: 68 additions & 0 deletions PersistMap.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,68 @@
    package com.wl.mts.tt.cm.id.issuer.connector.registry.data;

    import java.io.Serializable;
    import java.util.Map;

    import javax.persistence.CollectionTable;
    import javax.persistence.Column;
    import javax.persistence.ConstraintMode;
    import javax.persistence.ElementCollection;
    import javax.persistence.Embeddable;
    import javax.persistence.ForeignKey;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.MapKeyColumn;
    import javax.persistence.MappedSuperclass;
    import javax.persistence.SequenceGenerator;
    import javax.validation.constraints.NotNull;

    import com.google.common.collect.Maps;

    import lombok.Builder;
    import lombok.Data;
    import lombok.Getter;
    import lombok.RequiredArgsConstructor;
    import lombok.Setter;

    @MappedSuperclass

    /**
    * Base class for registrable entities.
    */
    @RequiredArgsConstructor
    @Getter @Setter
    public abstract class Registrable implements HasMetadata, Serializable {
    @Id
    @SequenceGenerator(
    name="registrableSequence",
    sequenceName="REGISTRABLE_SEQ"
    ) // Shared id generator between all Registrables
    @GeneratedValue(generator = "registrableSequence", strategy = GenerationType.SEQUENCE)
    private Long id;

    @CollectionTable(
    name = "registrable_metadata",
    joinColumns = @JoinColumn(name = "owner"),
    foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)
    ) // Similar to OneToMany but reinforce composition association
    @ElementCollection/*(targetClass = Metadata.class) <-- Unusable due to shared table */ // To manipule simple types instead of Metadata type
    @MapKeyColumn(name = "name") // name as map key
    @Column(name = "value") // value as map value
    private Map<String,String> metadatas = Maps.newHashMap();

    @Override
    public String getMetadata(@NotNull String keyName) {
    return metadatas.get(keyName);
    }

    @Embeddable
    @Builder
    @Data
    public static class Metadata {
    private Long owner;
    private String name;
    private String value;
    }
    }