2017-08-31 63 views
0

我有一個數據庫模式。表供應商有許多與provider_curr和provider_country一對多的關係(從prov_curr箭頭提供商必須轉換)多對多映射與枚舉

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; 
} 
+0

也許https://stackoverflow.com/a/16014318/3959856? –

+0

可能是[JPA映射集合的枚舉]的一個dublicate(https://stackoverflow.com/questions/416208/jpa-map-collection-of-enums) – HAYMbl4

+0

我試過了,但它對我不起作用。也許我做錯了。我在問題中添加了示例 –

回答

0

也許我錯了,我認爲你做了一個不正確的映射。

我想如果你試着用@ElementCollection@JoinTable這樣做,你需要改變表格結構。

第一:你不再需要交叉表有provcountryprovcurr

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

他們應該像這樣:

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