Hibernate产生我不想要也不需要的唯一约束

时间:2014-09-02 07:14:42

标签: java hibernate hsqldb

我有以下问题。

这是我的实体。

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 个答案:

答案 0 :(得分:2)

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

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