Hibernate:OneToMany的双向映射不起作用

Hibernate:OneToMany的双向映射不起作用,hibernate,one-to-many,bidirectional-relation,Hibernate,One To Many,Bidirectional Relation,我有以下三节课: import java.sql.Timestamp; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EnumType; import javax.persistence.Enumerated; import javax.p

我有以下三节课:

import java.sql.Timestamp;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Type;


@Entity

public class EventTO {

...
private List<EventAssignedResourceTO> eventAssignedResourceTOList;


/**
 * @return the eventAssignedResourceTOList
 */
@OneToMany(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
@JoinColumn(name = "EAR_EVN_ID")
public List<EventAssignedResourceTO> getEventAssignedResourceTOList() {
    return eventAssignedResourceTOList;
}

/**
 * @param eventAssignedResourceTOList
 *            the eventAssignedResourceTOList to set
 */
public void setEventAssignedResourceTOList(List<EventAssignedResourceTO>   eventAssignedResourceTOList) {
    this.eventAssignedResourceTOList = eventAssignedResourceTOList;
}

public void setPrivate(boolean aPrivate) {
    setPrivateEvent(aPrivate);
}

}
第三类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Type;


@Entity
public class EventResourceTO {
private String name;
private int count;
private boolean active;

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@Column(name = "ERS_ID")
public Long getId() {
    return super.getId();
}

/**
 * @return the name
 */
@Column(name="ERS_NAME")
public String getName() {
    return name;
}

/**
 * @param name
 *            the name to set
 */
public void setName(String name) {
    this.name = name;
}

/**
 * @return the count
 */
@Column(name="ERS_COUNT")
public int getCount() {
    return count;
}

/**
 * @param count
 *            the count to set
 */
public void setCount(int count) {
    this.count = count;
}

/**
 * @return the active
 */
@Type(type="yes_no")
@Column(name="ERS_IS_ACTIVE")
public boolean isActive() {
    return active;
}

/**
 * @param active
 *            the active to set
 */
public void setActive(boolean active) {
    this.active = active;
}

}
我在这里遵循了官方的hibernate文档:

下面这个例子:

问题是,在DB中插入EventTO时,我在eventId上得到了一个约束冲突,因为hibernate无法在EventAssignedResourceTO中设置EventTO中新创建的事件的id,并且id为null

因此,我决定删除EventAssignedResourceTO中JoinColumn注释中的可更新和可插入标记

现在insert可以正常工作,但是当我想删除一个事件时,hibernate会先删除AssignedResourceTO,然后删除该事件,最后我不知道为什么它会尝试更新其表中AssignedResourceTO的记录。在这里,它试图将eventTO的id设置为NULL,我得到了约束冲突。更新时也会发生同样的情况

我真的很困惑,因为官方文档中写的东西不起作用,而且我无法在网上找到任何解决方案

有什么想法吗


干杯

您不需要在
EventTO
类中使用
@JoinColumn(name=“EAR\u EVN\u ID”)
。而是将
mappedBy
添加到关联中。因此:

@OneToMany(mappedBy = "eventTO", fetch = FetchType.LAZY,cascade=CascadeType.ALL)
public List<EventAssignedResourceTO> getEventAssignedResourceTOList() {
    return eventAssignedResourceTOList;
}
@OneToMany(mappedBy=“eventTO”,fetch=FetchType.LAZY,cascade=CascadeType.ALL)
公共列表getEventAssignedResourceTOList(){
返回事件AssignedResourceList;
}

另外,对于
@OneToMany
关联,默认情况下
fetch
是延迟的
,您也可以删除该关联。

对于双向映射,仅在父级使用JoinColumn注释,在子级使用mappedBy属性。对于删除父级和子级实体之间的重复,请使用这些注释

@OneToMany(
            mappedBy = "queue_group",fetch = FetchType.LAZY,
            cascade = CascadeType.ALL
        )
    @JsonManagedReference
    private Set<Queue> queues;

 @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name = "qid")
       // @JsonIgnore
        @JsonBackReference
        private Queue_group queue_group;
@OneToMany(
mappedBy=“queue_group”,fetch=FetchType.LAZY,
cascade=CascadeType.ALL
)
@JsonManagedReference
私有集合队列;
@多通(级联=级联类型.ALL)
@JoinColumn(name=“qid”)
//@JsonIgnore
@JsonBackReference
专用队列组队列组;

我只能说为什么它尝试删除AssignedResourceTO,因为您使用了cascade=CascadeType.ALL-in-EventTO-OneToMany关系。实际上,关键是我希望AssignedResourceTO表中的记录被删除,因为当我删除事件时,我希望它的子项也被删除。事件及其子事件被删除,这是我想要的,但在最后hibernate尝试更新AssignedResourceTO表中的一条记录(我不知道是哪条记录,因为该记录确实在最后阶段被删除)它将eventId设置为NULL,这会导致异常。这真的很有趣,因为我所有的映射都是使用mappedBy标记的,我的原始配置是使用mappedBy注释的,但我不包括CascadeType.all,它将我带到了hibernate.org上的文档中,但它不起作用!!顺便说一句,它正在工作。干杯,谢谢你的回答。
@OneToMany(
            mappedBy = "queue_group",fetch = FetchType.LAZY,
            cascade = CascadeType.ALL
        )
    @JsonManagedReference
    private Set<Queue> queues;

 @ManyToOne(cascade=CascadeType.ALL)
        @JoinColumn(name = "qid")
       // @JsonIgnore
        @JsonBackReference
        private Queue_group queue_group;