Hibernate生成了我不需要的唯一约束条件。

3

我有以下问题。

这是我的实体。

TestTeam.java

package utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "TEST_TEAM")
public final class TestTeam implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -7275223441128447981L;

    @Id
    @Column(name = "NAME")
    private String name;

    @OneToMany(mappedBy = "playerId", cascade = CascadeType.ALL)
    private List<TestPlayer> test1List;

    public String getName() {
        return name;
    }

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

    public List<TestPlayer> getTest1List() {
        return test1List;
    }

    public void setTest1List(List<TestPlayer> test1List) {
        this.test1List = test1List;
    }

    public TestTeam() {
    }

    public TestTeam(final String name, final List<TestPlayer> test1List) {
        this.name = name;
        this.test1List = new ArrayList<>(test1List);
    }
}

TestPlayer.java

package utils;

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

import javax.persistence.CascadeType;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "TEST_PLAYER")
public class TestPlayer implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = -2792602076488917813L;

    @Id
    private long playerId;

    @Column(name = "NAME", nullable = false)
    private String playerName;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "TEAM_NAME")
    private TestTeam team;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "PREVIOUS_TEST_TEAM")
    private Map<Integer, TestTeam> previousTests = Collections.emptyMap();

    public TestPlayer() {
        // TODO Auto-generated constructor stub
    }

    public TestPlayer(final long playerId) {
        this.playerId = playerId;
    }

    public String getName() {
        return playerName;
    }

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

    /**
     * @return the team
     */
    public TestTeam getTeam() {
        return team;
    }

    /**
     * @param team the team to set
     */
    public void setTeam(TestTeam team) {
        this.team = team;
    }

    public Map<Integer, TestTeam> getPreviousTests() {
        return previousTests;
    }

    public void setPreviousTests(Map<Integer, TestTeam> previousTests) {
        this.previousTests = previousTests;
    }

    public TestPlayer(final String name,
            final Map<Integer, TestTeam> previousTests) {
        this.playerName = name;
        this.previousTests = new HashMap<>(previousTests);
    }
}

以下是有注释的收集。
  @ElementCollection(fetch = FetchType.EAGER)
  @CollectionTable(name = "PREVIOUS_TEST_TEAM")
  private Map<Integer, TestTeam> previousTests = Collections.emptyMap();

默认情况下,从TestTeam实体的外键会产生唯一约束。

create table PLAYERS_PREVIOUS_TEAMS (
    Player_ID bigint not null,
    previousTeamMap_NAME varchar(255) not null,
    previousTeamMap_KEY integer,
    primary key (Player_ID, previousTeamMap_KEY)
)

alter table PLAYERS_PREVIOUS_TEAMS 
    add constraint UK_f7nfahws0ttuhe5p7lpxt3vfv  unique (previousTeamMap_NAME)

我不需要这个限制,我希望关闭这种行为,以便Hibernate 不会生成它。我在网上花了一些时间寻找,但没有找到任何信息。我不想通过引入另一个实体来引入@OneToMany和许多@ManyToOne。是否有人遇到过类似的问题?


1
请查看此链接:https://dev59.com/CXDYa4cB1Zd3GeqPE930 - Vinit Prajapati
谢谢你的提示,但我已经去过那儿了。那个人使用ListSet,而我正在寻找一种涉及Map的解决方案。 - Jagger
实际上,添加@ManyToMany解决了问题。如果您将您的评论作为答案发布,我会接受它。否则,我会自己发布一个答案。 - Jagger
1个回答

5

我通过将@ElementCollection注释更改为@ManyToMany注释来解决了我的问题。

@ManyToMany(fetch = FetchType.EAGER)
@CollectionTable(name = "PREVIOUS_TEST_TEAM")
private Map<Integer, TestTeam> previousTests = Collections.emptyMap();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接