2012-02-23 4 views
0

участник форумакак удалить запись из таблицы соединений в спящем режиме

Мне нужна одна помощь от вас всех. У меня две модели POJO с отношением друг к другу. мой проект POJO ниже

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

    private Integer projectid; 
    private Date enddate; 
    private String projectdesc; 
    private String projectname; 
    private String projecttitle; 
    private Date startdate; 
    private Set<Task> tasks = new HashSet<Task>(0); 

    public Project() { 
    } 

    public Project (Integer id,String projectname, String projecttitle, String projectdesc, Date startdate, Date enddate) { 
     this.projectid = id; 
     this.enddate = enddate; 
     this.projectdesc = projectdesc; 
     this.projectname = projectname; 
     this.projecttitle = projecttitle; 
     this.startdate = startdate; 
    } 

    public Project(Date enddate, String projectdesc, String projectname, 
      String projecttitle, Date startdate, Set<Task> tasks) { 
     this.enddate = enddate; 
     this.projectdesc = projectdesc; 
     this.projectname = projectname; 
     this.projecttitle = projecttitle; 
     this.startdate = startdate; 
     this.tasks = tasks; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name = "projectid", unique = true, nullable = false) 
    public Integer getProjectid() { 
     return projectid; 
    } 

    public void setProjectid(Integer projectid) { 
     this.projectid = projectid; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "enddate", length = 19) 
    public Date getEnddate() { 
     return enddate; 
    } 

    public void setEnddate(Date enddate) { 
     this.enddate = enddate; 
    } 

    @Column(name = "projectdesc") 
    public String getProjectdesc() { 
     return projectdesc; 
    } 

    public void setProjectdesc(String projectdesc) { 
     this.projectdesc = projectdesc; 
    } 

    @Column(name = "projectname") 
    public String getProjectname() { 
     return projectname; 
    } 

    public void setProjectname(String projectname) { 
     this.projectname = projectname; 
    } 

    @Column(name = "projecttitle") 
    public String getProjecttitle() { 
     return projecttitle; 
    } 

    public void setProjecttitle(String projecttitle) { 
     this.projecttitle = projecttitle; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "startdate", length = 19) 
    public Date getStartdate() { 
     return startdate; 
    } 

    public void setStartdate(Date startdate) { 
     this.startdate = startdate; 
    } 

    @OneToMany(cascade = CascadeType.ALL, fetch =FetchType.EAGER) 
    @JoinTable(name = "project_task", joinColumns = { @JoinColumn(name = "projectid") }, inverseJoinColumns = { @JoinColumn(name = "taskid") }) 
    public Set<Task> getTasks() { 
     return tasks; 
    } 

    public void setTasks(Set<Task> tasks) { 
     this.tasks = tasks; 
    } 


} 

и моя задача POJO является

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

    private Integer taskid; 
    private Integer depth; 
    private Double duration; 
    private String durationunit; 
    private Date enddate; 
    private Integer parentid; 
    private Integer percentdone; 
    private Integer priority; 
    private Date startdate; 
    private Integer taskindex; 
    private String taskname; 

    public Task() { 
    } 

    public Task(Integer depth, Double duration, String durationunit, 
      Date enddate, Integer parentid, Integer percentdone, 
      Integer priority, Date startdate, Integer taskindex, 
      String taskname) { 
     this.depth = depth; 
     this.duration = duration; 
     this.durationunit = durationunit; 
     this.enddate = enddate; 
     this.parentid = parentid; 
     this.percentdone = percentdone; 
     this.priority = priority; 
     this.startdate = startdate; 
     this.taskindex = taskindex; 
     this.taskname = taskname; 
    } 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    @Column(name = "taskid", unique = true, nullable = false) 
    public Integer getTaskid() { 
     return taskid; 
    } 

    public void setTaskid(Integer taskid) { 
     this.taskid = taskid; 
    } 

    @Column(name = "depth") 
    public Integer getDepth() { 
     return depth; 
    } 

    public void setDepth(Integer depth) { 
     this.depth = depth; 
    } 

    @Column(name = "duration", precision = 22, scale = 0) 
    public Double getDuration() { 
     return duration; 
    } 

    public void setDuration(Double duration) { 
     this.duration = duration; 
    } 

    @Column(name = "durationunit") 
    public String getDurationunit() { 
     return durationunit; 
    } 

    public void setDurationunit(String durationunit) { 
     this.durationunit = durationunit; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "enddate", length = 19) 
    public Date getEnddate() { 
     return enddate; 
    } 

    public void setEnddate(Date enddate) { 
     this.enddate = enddate; 
    } 

    @Column(name = "parentid") 
    public Integer getParentid() { 
     return parentid; 
    } 

    public void setParentid(Integer parentid) { 
     this.parentid = parentid; 
    } 

    @Column(name = "percentdone") 
    public Integer getPercentdone() { 
     return percentdone; 
    } 

    public void setPercentdone(Integer percentdone) { 
     this.percentdone = percentdone; 
    } 

    @Column(name = "priority") 
    public Integer getPriority() { 
     return priority; 
    } 

    public void setPriority(Integer priority) { 
     this.priority = priority; 
    } 

    @Temporal(TemporalType.TIMESTAMP) 
    @Column(name = "startdate", length = 19) 
    public Date getStartdate() { 
     return startdate; 
    } 

    public void setStartdate(Date startdate) { 
     this.startdate = startdate; 
    } 

    @Column(name = "taskindex") 
    public Integer getTaskindex() { 
     return taskindex; 
    } 

    public void setTaskindex(Integer taskindex) { 
     this.taskindex = taskindex; 
    } 

    @Column(name = "taskname") 
    public String getTaskname() { 
     return taskname; 
    } 

    public void setTaskname(String taskname) { 
     this.taskname = taskname; 
    } 


} 

POJO проект связан с задачей, как один-к-многим. Теперь я хочу удалить одну задачу на основе передаваемого id, , но проблема в том, что я не могу удалить внешний ключ таблицы join project_task.

Я попытался ниже код, чтобы удалить project_task первый

Session session = this.hibernateTemplate.getSessionFactory().getCurrentSession(); 
     Query query = session.createQuery("delete from project_task where taskid="+id); 
     query.executeUpdate(); 

, а затем попытался удалить задачу с кодом ниже

Object record = hibernateTemplate.load(Task.class, id); 
hibernateTemplate.delete(record); 

, но не знаю, почему удаление не происходит. Любой имеющий идея, что я делаю неправильно в моем коде который не позволяет удаления быть случилось

+0

Существует ли конкретная причина, почему вы используете таблицу соединений для отношения «один ко многим», а не внешнего ключа на стороне «Задача»? – Sebastien

+0

Я просто хочу, чтобы моя база данных была чистой. моя таблица project_task будет управлять всеми отношениями между проектом и задачей. Один идентификатор проекта, связанный со многими задачами Id в таблице project_task. Теперь все работает правильно, я просто застрял, когда хочу удалить задачи. Любое решение, которое у вас есть? –

ответ

1

Try нарушение ассоциация первая:

Task record = hibernateTemplate.load(Task.class, id); 
Project project = hibernateTemplate.load(Project.class, projectId); 
project.getTasks().remove(record); 
hibernateTemplate.update(project); 
hibernateTemplate.delete(record); 

Если у вас нет идентификатора проекта, вы можете создать обратное отношение ManyToOne внутри задачи.

+0

Я пробовал ваше решение, но моя консоль дает мне ошибку ** ERROR org.hibernate.LazyInitializationException - не удалось инициализировать прокси - нет сеанса **, так в чем проблема сейчас? любая идея, почему ошибка наступает –

+0

Это странно, потому что коллекция задач очень загружена. Какое высказывание вызывает это? Возможно, это проблема с шаблоном спящего режима, насколько я помню, каждый вызов - это собственный сеанс. Можете ли вы переключиться на обычный сеанс спящего режима (например, без шаблона спящего режима)? –

+0

спасибо за ваш ответ. После смены шаблона спящего режима на обычный сеанс спящего режима все начинает работать отлично. –

0

может быть, вы должны изменить задачу, поставленную в проекте, а затем попытаться удалить задачу ...

Я думаю, что вы можете использовать cascade.type все (на setTasks) тоже ...

вы должны удалить из задачи, поставленной у вас есть задача, которую необходимо удалить ... и обновить объект

+0

Я действительно реализовал ** @ OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER) ** в моем проекте Pojo. Я просто хочу удалить свою задачу и все связанные с ней внешние ключи из таблицы project_task любым решением, которое у вас есть? –

+0

Пожалуйста, сообщите нам, какая у вас ошибка ... если у вас нет какой-либо ошибки, пожалуйста, проверьте вашу базу данных, а не код :) В hibernate есть кеширование. – Alex

+0

Hibernate не дает мне ошибку namde ** Невозможно удалить или обновить родительская строка: сбой ограничения внешнего ключа ('primavera'.'project_task', CONSTRAINT' FK3800AAEBACB7568D' FOREIGN KEY ('taskid') СПИСОК ЛИТЕРАТУРЫ' task' ('taskid')) ** в качестве таблицы соединений project_task имеет taskid в ней процедура удаления не удаляет задачу. Итак, как я могу удалить таблицу соединений project_task, содержащую taskid –

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