【问题标题】:Many To Many mapping with enums使用枚举的多对多映射
【发布时间】:2017-08-31 14:13:14
【问题描述】:

我有一个数据库架构。表 provider 与 provider_curr 和 provider_country 有多对多的关系(必须还原从 prov_curr 到 provider 的箭头)

schema

类提供者,

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
}

我一直在映射设置货币和设置国家。如何映射它们?

我试着让它变成这样,但它不起作用。

@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;
}

【问题讨论】:

标签: java hibernate enums


【解决方案1】:

也许我错了,我认为您制作了不正确的映射。

我想如果您尝试使用@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;
}

【讨论】:

    猜你喜欢
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多