2013-05-20 5 views
0

내가 세 가지 클래스가 작동하지 않습니다최대 절전 모드 : 양방향 매핑 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로 설정하려고 시도하고 제약 조건 위반이 발생합니다. 업데이트도 마찬가지입니다.

공식 문서에 쓰여진 내용이 작동하지 않아 웹상에서 해결책을 찾지 못해 혼란 스럽습니다.

어떤 아이디어 ??

건배

+0

EventTO OneToMany 관계에서 cascade = CascadeType.ALL을 사용했기 때문에 AssignedResourceTO를 삭제하려고하는 이유에 대해서만 말할 수 있습니다. – commit

+0

실제로 모든 점은 AssignedResourceTO 테이블에있는 레코드가 삭제되도록하려는 것입니다. 이벤트를 삭제할 때 해당 자식도 삭제되기를 원하기 때문입니다. 이벤트와 그 자식들은 삭제되고 이것은 내가 원하는 것이지만 hibernate는 AssignedResourceTO 테이블의 레코드를 업데이트하려고 시도한다. (나는 어떤 레코드를 알지 못한다!) 왜냐하면 실제로 마지막 레코드에서 레코드가 삭제되기 때문이다. 예외를 발생시키는 eventId는 NULL입니다. – LAC

답변

2

당신은 EventTO 클래스 @JoinColumn(name = "EAR_EVN_ID") 필요하지 않습니다. 대신 mappedBy을 연결에 추가하십시오. 그래서 :

@OneToMany(mappedBy = "eventTO", fetch = FetchType.LAZY,cascade=CascadeType.ALL) 
public List<EventAssignedResourceTO> getEventAssignedResourceTOList() { 
    return eventAssignedResourceTOList; 
} 

또한 fetch@OneToMany 협회에 대한 기본 LAZY입니다, 당신은 너무 그것을 제거 할 수 있습니다.

+0

모든 매핑이 mappedBy를 사용하여 표시되고 내 원래 구성에 mappedBy를 사용하여 주석을 추가했기 때문에 이것은 정말 재미 있습니다.하지만 CascadeType.ALL이 포함되지 않았기 때문에 작동하지 않는 hibernate.org의 설명서로 이동했습니다. Btw. 지금 일하고있다. 환호와 답에 감사드립니다. – LAC