簡體   English   中英

枚舉的多對多映射

[英]Many To Many mapping with enums

我有一個數據庫架構。 表provider與provider_curr和provider_country有許多關系(必須將從prov_curr到provider的箭頭還原)

圖式

類提供者,

package entity;

import Currency.Country;
import Currency.Currency;

import javax.persistence.*;
import java.util.*;

@Entity
@Table(name = "provider", schema = "public", catalog = "testdb")
public class ProviderEntity implements Comparable<ProviderEntity> {

    private String name;
    private int id;
    private Set<Currency> currencies = new HashSet<>();
    private Set<Country> countries = new HashSet<>();

    public ProviderEntity() {
    }


    public Set<Currency> getCurrencies() {
        return currencies;
    }

    public void setCurrencies(Set<Currency> currencies) {
        this.currencies = currencies;
    }


    public Set<Country> getCountries() {
        return countries;
    }

    public void setCountries(Set<Country> countries) {
        this.countries = countries;
    }



    @Id
    @Column(name = "id", nullable = false)
    public int getId() {
        return id;
    }

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


    @Basic
    @Column(name = "name", nullable = false, length = 45)
    public String getName() {
        return name;
    }

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



    public ProviderEntity(String name, Set<Currency> currencies, Set<Country> countries) {
        this.name = name;
        this.currencies = currencies;
        this.countries = countries;
    }


    @Override
    public String toString() {
        return "ProviderEntity " + name + "\n Currencies: " + currencies.toString() + "\n" + "Countries" + countries.toString() + "\n";
    }

    public static TreeSet<ProviderEntity> sortByName(Set<ProviderEntity> values) {
        Comparator<ProviderEntity> comp = (ProviderEntity o1, ProviderEntity o2) -> (o1.compareTo(o2));
        TreeSet<ProviderEntity> result = new TreeSet<>(comp);
        values.stream().forEach(providerEntity -> result.add(providerEntity));
        System.out.println(result);
        return result;
    }

    public void addCurrency(String currency) {
        for (int i = 0; i < Currency.values().length; i++) {
            if (Currency.values()[i].toString().equals(currency)) {
                currencies.add(Currency.values()[i]);
            }
        }
    }

    public void addCountry(String country) {
        for (int i = 0; i < Country.values().length; i++) {
            if (Country.values()[i].toString().equals(country)) {
                countries.add(Country.values()[i]);
            }
        }
    }

    public boolean containsCurrencsy(String currency) {
        for (int i = 0; i < Currency.values().length; i++) {
            if (currency.equals(Currency.values()[i].toString())) {
                return currencies.contains(Currency.values()[i]);
            }
        }
        return false;
    }

    public boolean containsCountry(String country) {
        for (int i = 0; i < Country.values().length; i++) {
            if (country.equals(Country.values()[i].toString())) {
                return countries.contains(Country.values()[i]);
            }
        }
        return false;
    }

    @Override
    public int compareTo(ProviderEntity o) {
        return (o.name.compareTo(this.name));
    }
}

枚舉國家

public enum Country {
    AUSTRALIA,
    AUSTRIA,
    AZERBAIJAN,
    ALBANIA,
    ALGERIA,
    ANGOLA,
    ARGENTINA,
    ARMENIA,
    ARUBA,
    BANGLADESH
}

和枚舉貨幣

public enum Currency {
    DOLLAR,
    EURO,
    MANAT,
    LEK,
    DINAR,
    KWANZA,
    PESO,
    DRAM,
    GUILDER,
    TAKA
}

我被困在映射Set貨幣和Set國家。 我該如何映射它們?

我試圖使它像這樣,但是沒有用。

@ElementCollection(targetClass = Currency.class)
@JoinTable(name = "provider_curr", joinColumns = @JoinColumn(name = "id"))
@Column(name = "id", nullable = false)
@Enumerated(EnumType.STRING)
public Set<Currency> getCurrencies() {
    return currencies;
}

public void setCurrencies(Set<Currency> currencies) {
    this.currencies = currencies;
}

@ElementCollection(targetClass = Country.class)
@JoinTable(name = "provider_country", joinColumns = @JoinColumn(name = "id"))
@Column(name = "id", nullable = false)
@Enumerated(EnumType.STRING)
public Set<Country> getCountries() {
    return countries;
}

public void setCountries(Set<Country> countries) {
    this.countries = countries;
}

我認為您做出了錯誤的映射,也許我錯了。

我想如果您嘗試使用@ElementCollection@JoinTable進行此操作,則需要更改表結構。

首先:您不再需要provcountryprovcurr的交叉表。

第二:從表provider_countryprovider_currency應該刪除列id (您可以使用enum代替entity並且它沒有標識符)。 這些表必須包含provider_id列( provider表的FK)。

它們應該看起來像:

// provider_country
-------------------------------------------------------
|   provider_id: Long   |   country: String           |
-------------------------------------------------------
|   1                   |   AUSTRALIA                 |
-------------------------------------------------------
|   2                   |   AUSTRALIA                 |
-------------------------------------------------------
|   1                   |   BANGLADESH                |
-------------------------------------------------------
|   3                   |   AZERBAIJAN                |
-------------------------------------------------------

// provider_currency                        
--------------------------------------------------------
|   provider_id: Long   |   currency: String           |
--------------------------------------------------------
| also can contain different currencies for different  |
| providers like the provider_country table            |
--------------------------------------------------------

映射應為:

@CollectionOfElements(targetClass = Country.class)
@JoinTable(name = "provider_country", joinColumns = @JoinColumn(name = "provider_id"))
@Column(name = "country", nullable = false)
@Enumerated(EnumType.STRING)
public Collection<Country> getCountries() {
    return countries;
}

@CollectionOfElements(targetClass = Currency.class)
@JoinTable(name = "provider_currency", joinColumns = @JoinColumn(name = "provider_id"))
@Column(name = "currency", nullable = false)
@Enumerated(EnumType.STRING)
public Collection<Currency> getCurrencies() {
    return currencies;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM