2012-01-01 6 views
0

У меня есть упражнение Spring + Hibernate. В качестве примера я выбрал блог. У меня две модели; Объект Blog и объект Теги. У них есть onetomany отношения. Когда я публикую и запускаю на сервере, я могу видеть элементы блога в базе данных, но спящий режим не вставляет теги. Я не мог понять, что я здесь отсутствует:Spring Hibernate onetomany relationship

enter image description here

теги в Блог модели:

@OneToMany(targetEntity=Tags.class, mappedBy="blog", fetch=FetchType.EAGER) 
    @Column(name="blog_tags") 
    public List<Tags> getBlogTags() { 
     return blogTags; 
    } 

    public void setBlogTags(List<Tags> blogTags) { 
     this.blogTags = blogTags; 
    } 

блог в тегах модели:

@ManyToOne(targetEntity=Blog.class,fetch=FetchType.EAGER) 
@JoinColumn(name="blog_id") 
public Blog getBlog() { 
    return blog; 
} 

public void setBlog(Blog blog) { 
    this.blog = blog; 
} 

спящий режим. hbm.xml:

<!-- Hibernate session factory --> 
<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 

    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 

    <property name="hibernateProperties"> 
     <props> 
     <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 

    <property name="annotatedClasses"> 
    <list> 
     <value>com.udb.blog.model.Blog</value> 
     <value>com.udb.blog.model.Tags</value> 
    </list> 
    </property> 

    </bean> 
</beans> 

blogBo (с использованием такой же, как осуществление blogDao):

public interface BlogBo { 

    void save(Blog blog); 
    void update(Blog blog); 
    void delete(Blog blog); 
    Blog getByTitle(String str); 

} 

тест сервлетов:

ApplicationContext appContext = new ClassPathXmlApplicationContext("spring/config/BeanLocations.xml"); 
    BlogBo blogBo = (BlogBo) appContext.getBean("blogBo"); 




    Blog blog = new Blog(); 
    blog.setBlogTitle("My Second blog"); 
    blog.setBlogDescription("testing onetomany relationship"); 
    blog.setBlogBody("testing done!"); 
    blog.setBlogDate(new Date(0)); 

    Tags tag = new Tags(); 
    tag.setTagName("first blog"); 

    Tags tag2 = new Tags(); 
    tag2.setTagName("Spring"); 

    tag.setBlog(blog); 
    tag2.setBlog(blog); 

    blogBo.save(blog); 

    Blog blog2 = blogBo.getByTitle("My Second blog"); 
    response.getWriter().write(blog2.toString()); 

спящий режим вывода:

Hibernate: insert into burak1_udb.blog (blog_body, blog_date, blog_desc, blog_title) values (?, ?, ?, ?) 
Hibernate: select blog0_.blog_id as blog1_0_, blog0_.blog_body as blog2_0_, blog0_.blog_date as blog3_0_, blog0_.blog_desc as blog4_0_, blog0_.blog_title as blog5_0_ from burak1_udb.blog blog0_ where blog_title=? 
Hibernate: select blogtags0_.blog_id as blog3_1_, blogtags0_.tag_id as tag1_1_, blogtags0_.tag_id as tag1_1_0_, blogtags0_.blog_id as blog3_1_0_, blogtags0_.tag_name as tag2_1_0_ from burak1_udb.tags blogtags0_ where blogtags0_.blog_id=? 
Hibernate: select blogtags0_.blog_id as blog3_1_, blogtags0_.tag_id as tag1_1_, blogtags0_.tag_id as tag1_1_0_, blogtags0_.blog_id as blog3_1_0_, blogtags0_.tag_name as tag2_1_0_ from burak1_udb.tags blogtags0_ where blogtags0_.blog_id=? 

Мне кажется, мне нужно изменить логику blogBo, что у конструктора может быть список тегов, но тогда мне не понадобится аннотация anetomany, и я хочу понять, что мне не хватает, если я хочу использовать эту аннотацию.

EDIT: Мое временное решение У меня есть changeg to manytomany. После того, как я создал третью таблицу, blogtags:

**@Entity 
@Table(name="blog_tags") 
public class BlogTags implements Serializable{ 
    /** 
    * 
    */ 
    public BlogTags(Blog blog, Tags tag){ 

     this.blogId = blog.getBlogId(); 
     this.tagId = tag.getTagId(); 
    }** 

Тогда я изменил blogDao, как показано ниже:

public void save(Blog blog, List<Tags> tags) { 
    getHibernateTemplate().save(blog); 

    for(Tags tag:tags){ 
     getHibernateTemplate().saveOrUpdate(tag); 
     BlogTags blogtags = new BlogTags(blog, tag); 
     getHibernateTemplate().saveOrUpdate(blogtags); 

    } 

и заключительный сервлета:

Tags tag = new Tags(); 
     tag.setTagName("myTag"); 

     Tags tag2 = new Tags(); 
     tag2.setTagName("Spring"); 

     Tags tag3 = new Tags(); 
     tag3.setTagName("Hibernate"); 

     Tags tag4 = new Tags(); 
     tag4.setTagName("ManytoMany"); 

     List<Tags> tags = new ArrayList<Tags>(); 
     tags.add(tag); 
     tags.add(tag2); 
     tags.add(tag3); 
     tags.add(tag4); 

     Blog blog = new Blog(); 
     blog.setBlogTitle("myTest"); 
     blog.setBlogDescription("testDesc"); 
     blog.setBlogBody("body"); 
     blog.setBlogDate(new Date(0)); 

     blogBo.save(blog, tags); 

ответ

0

На @OneToMany отношение боковой на Blog т.е. объекта со стороны множества каскадного стиля CascadeType.SAVE_UPDATE, чтобы получить или сохранить операции обновления получить каскад на это связано дочерних объектов. В противном случае вы должны сохранить их вручную.

+0

Спасибо, ваше решение работает! – HRgiger

1

Try вручную добавить тег в Блог, чтобы вместо:

tag.setBlog(blog); 
tag2.setBlog(blog); 

сделать:

blog.getBlogTags().add(tag); 
blog.getBlogTags().add(tag2); 
+0

Спасибо Я пробовал, но не работает. Пока я не найду лучшее решение, я сохранил элементы вручную, используя getHibernateTemplate в blogDao. Я обновил свой вопрос. Надеюсь, что будет лучшее решение :) – HRgiger

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