hibernate session.persist(object)在数据库中创建更多行

时间:2014-12-15 10:48:36

标签: java database hibernate

Helo,

我有方法

public void createContest(Contest c) {      
    session.beginTransaction();
    session.persist(c);
    session.getTransaction().commit();
    logger.info("Contest saved successfully!");
}

我用一个对象在一个地方调用它,但是这个方法将对象竞赛保存到数据库4x。可能是什么问题?

以下是比赛课程:

@Entity
@Table(name = "Contest")
public class Contest implements java.io.Serializable {

@Id
@Column(name="CONTEST_ID", unique = true, nullable = false, precision = 5, scale = 0)
@GeneratedValue
private int id;

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

@Column(name="DATE_OF_EVENT")
private Date dateOfEvent;

@Column(name="REG_OPEN")
private Date regOpen;

@Column(name="REG_CLOSE")
private Date regClose;

@Column(name="REG_RESTRICTION")
private Boolean regRestriction;

@Column(name="CAPACITY")
private int capacity;

@OneToMany(mappedBy="upperContest")
private List<Contest> precontests;

@ManyToOne(cascade={CascadeType.ALL})
@JoinColumn(name="UPPER_CONTEST_ID")
private Contest upperContest;

@ManyToMany(cascade = {CascadeType.ALL})
@JoinTable(name="MANAGING", 
            joinColumns={@JoinColumn(name="CONTEST_ID")}, 
            inverseJoinColumns={@JoinColumn(name="PERSON_ID")})
private List<Person> managers;

@OneToMany(mappedBy="contest")
private List<Team> teams;

public Contest(String name, Date dateOfEvent, Date regOpen,
        Date regClose, Boolean regRestriction) {
    this.name = name;
    this.dateOfEvent = dateOfEvent;
    this.regOpen = regOpen;
    this.regClose = regClose;
    this.regRestriction = regRestriction;

    this.precontests = new ArrayList<Contest>();
    this.managers = new ArrayList<Person>();
    this.teams = new ArrayList<Team>();
}

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

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

public Date getDateOfEvent() {
    return dateOfEvent;
}

public void setDateOfEvent(Date dateOfEvent) {
    this.dateOfEvent = dateOfEvent;
}

public Date getRegOpen() {
    return regOpen;
}
public void setRegOpen(Date regOpen) {
    this.regOpen = regOpen;
}   

public Date getRegClose() {
    return regClose;
}
public void setRegClose(Date regClose) {
    this.regClose = regClose;
}

public Boolean getRegRestriction() {
    return regRestriction;
}
public void setRegRestriction(Boolean regRestriction) {
    this.regRestriction = regRestriction;
}

public int getCapacity() {
    return capacity;
}

public void setCapacity(int capacity) {
    this.capacity = capacity;
}

public Contest getUpperContest() {
    return upperContest;
}

public void setUpperContest(Contest c) {
    this.upperContest = c;
}

public List<Contest> getPrecontests() {
    return precontests;
}

public void addPrecontest(Contest e) {
    this.precontests.add(e);
} 

public void addManager(Person p){
    this.managers.add(p);
}

public void addTeam(Team t){
    this.teams.add(t);
}

public List<Person> getManagers(){
    return managers;
}

}

现在由于stackoverflow的限制,我必须添加一些文本。这样酷。非常哇。

1 个答案:

答案 0 :(得分:0)

您尚未在实例化Contest的位置发布代码并填充其字段,但upperContest可能是原因。你在映射上有CascadeType.ALL,所以你可能正在坚持一场有较高比赛的比赛,因此实际上由于级联设置而持续存在两个实例。没有该代码,无法确定。