JPA tabela propertisow (key,value) - jak zmapowac

0

Cześć, możecie podpowiedzieć jak zmapować taka tabelkę do Entity (@Id{ID_USER, PROP_KEY})? Natknęłam się na kilka postów, ale w nich wykorzystywane były dwie encje do mapowania.

ID_USER PROP_KEY PROP_VALUE
1 prop_1 some_val
1 prop_2 some_val
2 prop_1 some_val

Z gory dzięki za pomoc :)

1

Z użyciem klucza złożonego:

@Embeddable
public class UserProp{
    
     private User user;
     private Property prop;
}

@Entity
public class UserPropValue{

    @EmbeddedId 
    private UserProp userProp;

    private String value
}

Gdzie User jest oczywisty, a Property to klasa reprezentująca metadane własności np.:

@Entity
public class Property{

    private String name;
    private Type type;
    
    @Id
    private long id;
}
0

Czyli analogicznie dla przedstawionej tabeli, powinno to być cos takiego? Zakładając, ze mam te jedna tabelkę (pomijajac User), czy wszystkie encje powinny być do niej zmapowane?

@Entity
@Table(name="USER_PROPERTIES") //??
public class Property{

    @Id
    @Column(name="ID_USER")
    private long id;

    @Column(name="PROP_KEY")
    private String name;
    //...   
}

@Entity
@Table(name="USER_PROPERTIES") //??
public class UserPropValue{
 
    @EmbeddedId 
    private UserProp userProp;
 
    @Column(name="PROP_VALUE")
    private String value;
}

@Embeddable
public class UserProp{
 
     private User user;
     private Property prop;
}
0

W międzyczasie próbowałam jeszcze z @MapKeyColumn i doszłam do czegoś takiego:

@Entity
@Table(name = "USER_PROPERTIES")
public class UserProperties implements Serializable {

    @Id
    @Column(name = "ID_USER")
    private Integer id;

    @ElementCollection
    @MapKeyColumn(name = "PROP_KEY")
    @Column(name = "PROP_VALUE")
    @CollectionTable(name = "USER_PROPERTIES", joinColumns = @JoinColumn(name = "ID_USER"))
    private Map<String, String> properties = new HashMap();

    public Integer getId() {
        return id;
    }

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

    public Map<String, String> getProperties() {
        return properties;
    }

    public void setProperties(Map<String, String> properties) {
        this.properties = properties;
    }
}

To jest JSON jaki wypluło, wydaje się działać ale jeszcze będę to testować:

{"id":1,"properties":{"first_prop":"Value1","next_prop":"Value2"}}

Nie mam pojęcia natomiast, które rozwiązanie jest lepsze- to przedstawione przez @Koziołek czy to z @ElementCollection, np. z punktu widzenia wydajności i szybkości działania.

0

Zapytam z ciekawości.

A jak będzie to wyglądał schemat tabeli na bazie danych?

1 użytkowników online, w tym zalogowanych: 0, gości: 1