2013-05-20 2 views
0

У меня есть три класса следующим образом:Hibernate: двунаправленная отображение 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/

Проблема заключается в том, что при вставке EventTO в БД я получаю нарушение ограничения на EVENTID, потому что спящий режим не может установить идентификатор вновь созданного события в eventTO в EventAssignedResourceTO и идентификатор ноль .

Поэтому я решил удалить обновляемый и вставляемый тег в аннотации JoinColumn в EventAssignedResourceTO.

Теперь вставка работает правильно, но когда я хочу удалить событие, hibernate сначала удаляет AssignedResourceTO, а затем событие, а в конце я не знаю, почему он пытается обновить запись AssignedResourceTO в своей таблице. Здесь он пытается установить id события eventTO равным NULL, и я получаю нарушение ограничений. то же самое происходит и для обновления.

Я действительно смущен, так как то, что написано в официальной документации, не работает, и я не смог найти какое-либо решение в Интернете.

любая идея ??

Приветствия

+0

Я могу только сказать о том, почему он пытается удалить AssignedResourceTO, потому что вы использовали cascade = CascadeType.ALL в отношениях EventTO OneToMany. – commit

+0

На самом деле, все дело в том, что я хочу, чтобы запись в таблице AssignedResourceTO удалялась, потому что когда я удаляю событие, я хочу, чтобы его дети также были удалены. Событие и его дети удаляются, и это то, что я хочу, но в конце hibernate пытается обновить запись в таблице AssignedResourceTO (я не знаю, какая запись !, потому что действительно запись удалена на последней фазе), и она устанавливает eventId to NULL, который вызывает исключение. – LAC

ответ

2

Вам не нужно @JoinColumn(name = "EAR_EVN_ID") в EventTO классе. Вместо этого добавьте mappedBy в ассоциацию. Итак:

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

Также fetch по умолчанию LAZY для @OneToMany ассоциаций, вы можете удалить это.

+0

Это действительно смешно, так как все мои сопоставления отмечены с помощью mappedBy, и моя первоначальная конфигурация была аннотирована с использованием mappedBy, но я не включаю CascadeType.ALL, и это привело меня к документации на hibernate.org, которая не сработала! Btw. он работает сейчас. Приветствия и спасибо за ответ. – LAC

 Смежные вопросы

  • Нет связанных вопросов^_^