내가 세 가지 클래스가 작동하지 않습니다최대 절전 모드 : 양방향 매핑 OneToMany은 다음과
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.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
@Entity
public class EventAssignedResourceTO {
private EventTO eventTO;
private EventResourceTO eventResourceTO;
private int resourceCount;
/**
* @return the eventTO
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "EAR_EVN_ID", updatable = false, insertable=false, nullable = false)
public EventTO getEventTO() {
return eventTO;
}
/**
* @param eventTO
* the eventTO to set
*/
public void setEventTO(EventTO eventTO) {
this.eventTO = eventTO;
}
/**
* @return the eventResourceId
*/
@Transient
public Long getEventResourceId() {
return eventResourceId;
}
/**
* @param eventResourceId
* the eventResourceId to set
*/
public void setEventResourceId(Long eventResourceId) {
this.eventResourceId = eventResourceId;
}
/**
* @return the resourceCount
*/
@Column(name = "EAR_COUNT")
public int getResourceCount() {
return resourceCount;
}
/**
* @param resourceCount
* the resourceCount to set
*/
public void setResourceCount(int resourceCount) {
this.resourceCount = resourceCount;
}
/**
* @return the eventResourceTO
*/
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "EAR_ERS_ID")
public EventResourceTO getEventResourceTO() {
return eventResourceTO;
}
/**
* @param eventResourceTO
* the eventResourceTO to set
*/
public void setEventResourceTO(EventResourceTO eventResourceTO) {
this.eventResourceTO = eventResourceTO;
}
}
세 번째 클래스 :
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;
}
}
I을 공식적인 최대 절전 모드 문서를 여기에 따라왔다 : http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#collections-bidirectional
여기 예 : http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/
문제는 DB에 EventTO을 삽입하는 동안 최대 절전 모드가 EventAssignedResourceTO의 eventTO에서 새로 만든 이벤트의 ID를 설정할 수 없습니다 때문에이 이벤트 ID에 제약 조건 위반을 얻을하고 ID입니다 없는 .
그래서 EventAssignedResourceTO의 JoinColumn 주석에서 업데이트 가능 및 삽입 가능 태그를 제거하기로 결정했습니다.
이제는 삽입이 제대로 작동하지만 최대 절전 모드에서 이벤트를 삭제하려면 먼저 AssignedResourceTO를 삭제 한 다음 이벤트에서 끝내서 테이블의 AssignedResourceTO 레코드를 업데이트하려고하는 이유를 알 수 없습니다. 여기에 eventTO의 id를 NULL로 설정하려고 시도하고 제약 조건 위반이 발생합니다. 업데이트도 마찬가지입니다.
공식 문서에 쓰여진 내용이 작동하지 않아 웹상에서 해결책을 찾지 못해 혼란 스럽습니다.
어떤 아이디어 ??
건배
EventTO OneToMany 관계에서 cascade = CascadeType.ALL을 사용했기 때문에 AssignedResourceTO를 삭제하려고하는 이유에 대해서만 말할 수 있습니다. – commit
실제로 모든 점은 AssignedResourceTO 테이블에있는 레코드가 삭제되도록하려는 것입니다. 이벤트를 삭제할 때 해당 자식도 삭제되기를 원하기 때문입니다. 이벤트와 그 자식들은 삭제되고 이것은 내가 원하는 것이지만 hibernate는 AssignedResourceTO 테이블의 레코드를 업데이트하려고 시도한다. (나는 어떤 레코드를 알지 못한다!) 왜냐하면 실제로 마지막 레코드에서 레코드가 삭제되기 때문이다. 예외를 발생시키는 eventId는 NULL입니다. – LAC