2012-3-23 10:06:11 org.hibernate.util.JDBCExceptionReporter logExceptions  
    警告: SQL Error: 1452, SQLState: 23000  
    2012-3-23 10:06:11 org.hibernate.util.JDBCExceptionReporter logExceptions  
    严重: Cannot add or update a child row: a foreign key constraint fails (`studysystem`.`articleinfor`, CONSTRAINT `FKE90A0E4EE57DF3E5` FOREIGN KEY (`typeid`) REFERENCES `articletype` (`typeid`))  
    org.springframework.dao.DataIntegrityViolationException: could not insert: [com.studysystem.model.article.ArticleInfor]; SQL [insert into articleinfor (articleName, authorName, brandid, clickcount, commend, content, createDate, description, typeid, viewcount, visible) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not insert: [com.studysystem.model.article.ArticleInfor]  
        at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:637)  
        at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412)  
        at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:411)  
        at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)  
        at org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:683)  
        at com.studysystem.dao.handler.imp.spring.SpringHandler.saveObj(SpringHandler.java:58)  
        at com.studysystem.dao.BaseDAO.save(BaseDAO.java:41)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        at java.lang.reflect.Method.invoke(Method.java:597)  
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)  
        at $Proxy29.save(Unknown Source)  
        at com.studysystem.service.BaseService.save(BaseService.java:32)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        at java.lang.reflect.Method.invoke(Method.java:597)  
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)  
        at $Proxy39.save(Unknown Source)  
        at JUnit.test.ArticleInforServiceTest.testSave(ArticleInforServiceTest.java:68)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
        at java.lang.reflect.Method.invoke(Method.java:597)  
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)  
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)  
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)  
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)  
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)  
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)  
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)  
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)  
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)  
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)  
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)  
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)  
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)  
        at org.junit.runners.ParentRunner.run(ParentRunner.java:300)  
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)  
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)  
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)  
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
    Caused by: org.hibernate.exception.ConstraintViolationException: could not insert: [com.studysystem.model.article.ArticleInfor]  
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)  
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)  
        at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:64)  
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2329)  
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2836)  
        at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)  这是我junit测试出来的
Java代码  收藏代码    org.hibernate.AssertionFailure: null id in com.studysystem.model.article.ArticleInfor entry (don't flush the Session after an exception occurs)  
        at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:82)  
        at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:190)  
        at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:147)  
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:219)  
        at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:99)  
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)  
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)  
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)  
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)  
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656)  
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)  
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)  
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:375)  
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)  
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)  
        at $Proxy39.save(Unknown Source)  
        at JUnit.test.ArticleInforServiceTest.testSave(ArticleInforServiceTest.java:68)  
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
    
 

解决方案 »

  1.   

    这个是我的model类
    Java代码  收藏代码    /** 
         *  
         */  
        package com.studysystem.model.article;  
          
          
        import java.io.Serializable;  
        import java.util.Date;  
        import java.util.HashSet;  
        import java.util.Set;  
          
        import javax.persistence.CascadeType;  
        import javax.persistence.Column;  
        import javax.persistence.Entity;  
        import javax.persistence.GeneratedValue;  
        import javax.persistence.Id;  
        import javax.persistence.JoinColumn;  
        import javax.persistence.Lob;  
        import javax.persistence.ManyToOne;  
        import javax.persistence.OneToMany;  
        import javax.persistence.OrderBy;  
        import javax.persistence.Table;  
        import javax.persistence.Temporal;  
        import javax.persistence.TemporalType;  
          
        import org.compass.annotations.Index;  
        import org.compass.annotations.Searchable;  
        import org.compass.annotations.SearchableComponent;  
        import org.compass.annotations.SearchableId;  
        import org.compass.annotations.SearchableProperty;  
        import org.compass.annotations.Store;  
          
        /** 
         * @author zouqianheng 
         *2012-3-6 
         *TODO 
         */  
        @SuppressWarnings("serial")  
        @Entity @Searchable @Table(name="articleinfor")  
        public class ArticleInfor implements Serializable {  
            @Id @GeneratedValue @SearchableId  
             private Integer id;  
             /**书名**/  
            @ManyToOne(cascade=CascadeType.REFRESH)  
            @JoinColumn(name="brandid") @SearchableComponent  
             private Brand brand;  
            @Column(name="articleName",length=50,nullable=false) @SearchableProperty(boost=2,name="articleName")  
             private String articleName;  
            @Column(name="authorName",length=50) @SearchableProperty(index=Index.NO,store=Store.YES)  
             private String authorName;//作者的名字  
             @Column(name="description",nullable=false,length=300) @SearchableProperty(index=Index.NO,store=Store.YES)  
             private String description;//内容简介  
             @Lob @Column(name="content",nullable=false) @SearchableProperty  
             private String content;//详细内容  
             @Temporal(TemporalType.TIMESTAMP)  
            @Column(name="createDate",nullable=false)  
             private Date createDate=new Date();//上架日期  
             @Column(nullable=false)  
             private Boolean visible=true;//是否可见  
             /** 观看量 **/  
            @Column(nullable=false)  
            private Integer viewcount = 0;  
               
             @Column(name="clickcount",nullable=false)  
             private Integer clickcount=1;//人气指数  
             @Column(name="commend",nullable=false)  
             private Boolean commend=false;//是否推荐  
             @ManyToOne(cascade=CascadeType.REFRESH,optional=false)  
             @JoinColumn(name="typeid") @SearchableComponent  
             private ArticleType type;//文章样式  
             @OneToMany(cascade={CascadeType.REMOVE,CascadeType.PERSIST},mappedBy="article")  
             @OrderBy("visible desc,id asc")  
             @SearchableComponent  
             private Set<ArticleStyle> styles=new HashSet<ArticleStyle>();//文章类型  
               
             public void removeArticleStyle(ArticleStyle style){  
                 if(this.styles.contains(style)){  
                     this.styles.remove(style);  
                     style.setArticle(null);  
                 }  
                   
             }  
             public void addArticleStyle(ArticleStyle style){  
                 if(!this.styles.contains(style)){  
                     this.styles.add(style);  
                    style.setArticle(this);  
                       
                      
                 }   
             }  
               
            public Integer getId() {  
                return id;  
            }  
            public void setId(Integer id) {  
                this.id = id;  
            }  
              
              
            public String getArticleName() {  
                return articleName;  
            }  
            public void setArticleName(String articleName) {  
                this.articleName = articleName;  
            }  
            public String getAuthorName() {  
                return authorName;  
            }  
            public void setAuthorName(String authorName) {  
                this.authorName = authorName;  
            }  
              
            public String getDescription() {  
                return description;  
            }  
            public void setDescription(String description) {  
                this.description = description;  
            }  
            public String getContent() {  
                return content;  
            }  
            public void setContent(String content) {  
                this.content = content;  
            }  
            public Date getCreateDate() {  
                return createDate;  
            }  
            public void setCreateDate(Date createDate) {  
                this.createDate = createDate;  
            }  
            public Boolean getVisible() {  
                return visible;  
            }  
            public void setVisible(Boolean visible) {  
                this.visible = visible;  
            }  
            public Integer getClickcount() {  
                return clickcount;  
            }  
            public void setClickcount(Integer clickcount) {  
                this.clickcount = clickcount;  
            }  
          
            public Integer getViewcount() {  
                return viewcount;  
            }  
            public void setViewcount(Integer viewcount) {  
                this.viewcount = viewcount;  
            }  
            public Boolean getCommend() {  
                return commend;  
            }  
            public void setCommend(Boolean commend) {  
                this.commend = commend;  
            }  
            public ArticleType getType() {  
                return type;  
            }  
            public void setType(ArticleType type) {  
                this.type = type;  
            }  
            public Set<ArticleStyle> getStyles() {  
                return styles;  
            }  
            public void setStyles(Set<ArticleStyle> styles) {  
                this.styles = styles;  
                  
            }  
               
                public Brand getBrand() {  
                    return brand;  
                }  
                public void setBrand(Brand brand) {  
                    this.brand = brand;  
                }  
            @Override  
            public int hashCode() {  
                final int prime = 31;  
                int result = 1;  
                result = prime * result + ((id == null) ? 0 : id.hashCode());  
                return result;  
            }  
            @Override  
            public boolean equals(Object obj) {  
                if (this == obj)  
                    return true;  
                if (obj == null)  
                    return false;  
                if (getClass() != obj.getClass())  
                    return false;  
                final ArticleInfor other = ( ArticleInfor ) obj;  
                if (id == null) {  
                    if (other.id != null)  
                        return false;  
                } else if (!id.equals(other.id))  
                    return false;  
                return true;  
            }  
          
        }   
     告诉原因吗求解救!
      

  2.   

    Java代码  收藏代码    /** 
         *  
         */  
        package com.studysystem.model.article;  
          
        import javax.persistence.CascadeType;  
        import javax.persistence.Column;  
        import javax.persistence.Entity;  
        import javax.persistence.GeneratedValue;  
        import javax.persistence.Id;  
        import javax.persistence.JoinColumn;  
        import javax.persistence.ManyToOne;  
        import javax.persistence.Table;  
        import javax.persistence.Transient;  
          
          
        import org.compass.annotations.Index;  
        import org.compass.annotations.Searchable;  
        import org.compass.annotations.SearchableProperty;  
        import org.compass.annotations.SearchableReference;  
        import org.compass.annotations.Store;  
          
        /** 
         * @author zouqianheng 
         *2012-3-6 
         *TODO 
         */  
        @Entity@Table(name="articlestyle") @Searchable(root=false)  
        public class ArticleStyle {  
             
            @Id @GeneratedValue @SearchableProperty(index=Index.NO,store=Store.YES)  
          
            private Integer id;  
            @Column(name="styleName",length=30,nullable=false)@SearchableProperty(index=Index.NO,store=Store.YES,name="styleName")  
            private String styleName;//��ʽ���  
            @Column(name="imagename",length=40,nullable=false)@SearchableProperty(index=Index.NO,store=Store.YES)  
            private String imagename;//ͼƬ  
            @Column(name="visible",nullable=false)  
            private Boolean visible= true;//ͼƬ�Ƿ�ɼ�  
            @ManyToOne(cascade=CascadeType.REFRESH,optional=false)  
            @JoinColumn(name="articleid") @SearchableReference  
            private ArticleInfor article;  
            public ArticleStyle(){}  
            public ArticleStyle(String name, String imagename) {  
                this. styleName = name;  
                this.imagename = imagename;  
            }  
          
            public Integer getId() {  
                return id;  
            }  
            public void setId(Integer id) {  
                this.id = id;  
            }  
              
          
            public String getStyleName() {  
                return styleName;  
            }  
            public void setStyleName(String styleName) {  
                this.styleName = styleName;  
            }  
            public String getImagename() {  
                return imagename;  
            }  
            public void setImagename(String imagename) {  
                this.imagename = imagename;  
            }  
            public Boolean getVisible() {  
                return visible;  
            }  
            public void setVisible(Boolean visible) {  
                this.visible = visible;  
            }  
            public ArticleInfor getArticle() {  
                return article;  
            }  
          
            public void setArticle(ArticleInfor article) {  
                this.article = article;  
                System.out.println(this.article);  
            }  
            @Transient  
            public String getImageFullPath(){  
                return "/images/article/"+ this.getArticle().getType().getTypeid()+ "/"+  
                this.getArticle().getId()+ "/prototype/"+ this.imagename;  
            }  
            @Transient  
            public String getImage140FullPath(){  
                return "/images/article/"+ this.getArticle().getType().getTypeid()+ "/"+  
                this.getArticle().getId()+ "/140x/"+ this.imagename;  
            }  
            @Override  
            public int hashCode() {  
                final int prime = 31;  
                int result = 1;  
                result = prime * result + ((id == null) ? 0 : id.hashCode());  
                return result;  
            }  
            @Override  
            public boolean equals(Object obj) {  
                if (this == obj)  
                    return true;  
                if (obj == null)  
                    return false;  
                if (getClass() != obj.getClass())  
                    return false;  
                final ArticleStyle other = (ArticleStyle) obj;  
                if (id == null) {  
                    if (other.id != null)  
                        return false;  
                } else if (!id.equals(other.id))  
                    return false;  
                return true;  
            }  
          
          
        }   
    Java代码  收藏代码    /** 
         *  
         */  
        package com.studysystem.model.article;  
          
        import javax.persistence.CascadeType;  
        import javax.persistence.Column;  
        import javax.persistence.Entity;  
        import javax.persistence.GeneratedValue;  
        import javax.persistence.Id;  
        import javax.persistence.JoinColumn;  
        import javax.persistence.ManyToOne;  
        import javax.persistence.Table;  
        import javax.persistence.Transient;  
          
          
        import org.compass.annotations.Index;  
        import org.compass.annotations.Searchable;  
        import org.compass.annotations.SearchableProperty;  
        import org.compass.annotations.SearchableReference;  
        import org.compass.annotations.Store;  
          
        /** 
         * @author zouqianheng 
         *2012-3-6 
         *TODO 
         */  
        @Entity@Table(name="articlestyle") @Searchable(root=false)  
        public class ArticleStyle {  
             
            @Id @GeneratedValue @SearchableProperty(index=Index.NO,store=Store.YES)  
          
            private Integer id;  
            @Column(name="styleName",length=30,nullable=false)@SearchableProperty(index=Index.NO,store=Store.YES,name="styleName")  
            private String styleName;//��ʽ���  
            @Column(name="imagename",length=40,nullable=false)@SearchableProperty(index=Index.NO,store=Store.YES)  
            private String imagename;//ͼƬ  
            @Column(name="visible",nullable=false)  
            private Boolean visible= true;//ͼƬ�Ƿ�ɼ�  
            @ManyToOne(cascade=CascadeType.REFRESH,optional=false)  
            @JoinColumn(name="articleid") @SearchableReference  
            private ArticleInfor article;  
            public ArticleStyle(){}  
            public ArticleStyle(String name, String imagename) {  
                this. styleName = name;  
                this.imagename = imagename;  
            }  
          
            public Integer getId() {  
                return id;  
            }  
            public void setId(Integer id) {  
                this.id = id;  
            }  
              
          
            public String getStyleName() {  
                return styleName;  
            }  
            public void setStyleName(String styleName) {  
                this.styleName = styleName;  
            }  
            public String getImagename() {  
                return imagename;  
            }  
            public void setImagename(String imagename) {  
                this.imagename = imagename;  
            }  
            public Boolean getVisible() {  
                return visible;  
            }  
            public void setVisible(Boolean visible) {  
                this.visible = visible;  
            }  
            public ArticleInfor getArticle() {  
                return article;  
            }  
          
            public void setArticle(ArticleInfor article) {  
                this.article = article;  
                System.out.println(this.article);  
            }  
            @Transient  
            public String getImageFullPath(){  
                return "/images/article/"+ this.getArticle().getType().getTypeid()+ "/"+  
                this.getArticle().getId()+ "/prototype/"+ this.imagename;  
            }  
            @Transient  
            public String getImage140FullPath(){  
                return "/images/article/"+ this.getArticle().getType().getTypeid()+ "/"+  
                this.getArticle().getId()+ "/140x/"+ this.imagename;  
            }  
            @Override  
            public int hashCode() {  
                final int prime = 31;  
                int result = 1;  
                result = prime * result + ((id == null) ? 0 : id.hashCode());  
                return result;  
            }  
            @Override  
            public boolean equals(Object obj) {  
                if (this == obj)  
                    return true;  
                if (obj == null)  
                    return false;  
                if (getClass() != obj.getClass())  
                    return false;  
                final ArticleStyle other = (ArticleStyle) obj;  
                if (id == null) {  
                    if (other.id != null)  
                        return false;  
                } else if (!id.equals(other.id))  
                    return false;  
                return true;  
            }  
          
          
        }  
      

  3.   


     
    Java代码  收藏代码    /** 
         *  
         */  
        package com.studysystem.model.article;  
          
        import java.util.HashSet;  
        import java.util.Set;  
          
        import javax.persistence.CascadeType;  
        import javax.persistence.Column;  
        import javax.persistence.Entity;  
        import javax.persistence.GeneratedValue;  
        import javax.persistence.GenerationType;  
        import javax.persistence.Id;  
        import javax.persistence.JoinColumn;  
        import javax.persistence.ManyToOne;  
        import javax.persistence.OneToMany;  
        import javax.persistence.Table;  
          
        import org.compass.annotations.Index;  
        import org.compass.annotations.Searchable;  
        import org.compass.annotations.SearchableProperty;  
        import org.compass.annotations.Store;  
          
        /** 
         * @author zouqianheng 
         *2012-3-6 
         *TODO 
         */  
        @Entity @Searchable(root=false)@Table(name="articletype")  
        public class ArticleType {  
            @Id @GeneratedValue(strategy=GenerationType.AUTO)  
            @SearchableProperty(index=Index.NO,store=Store.YES)  
            private Integer typeid;//���id  
            @Column(name="typeName",length=36,nullable=false)@SearchableProperty  
            (index=Index.NOT_ANALYZED,store=Store.YES,name="typeName")  
            private String typeName;//������  
            @Column(name="note",length=200)  
            private String note;//��ע��������������ҳ������  
            @Column(name="visible",nullable=false)  
            private Boolean visible=true;//�Ƿ�ɼ�  
            @OneToMany(cascade={CascadeType.REFRESH,CascadeType.REMOVE},mappedBy="parent")  
            private Set<ArticleType> childTypes=new HashSet<ArticleType>();//�����  
            @ManyToOne(cascade=CascadeType.REFRESH)@JoinColumn(name="parentid")  
            private ArticleType parent;//��������  
            @OneToMany(mappedBy="type", cascade=CascadeType.REMOVE)  
            private Set<ArticleInfor> article=new HashSet<ArticleInfor>();  
              
            public ArticleType(){}  
            public ArticleType(Integer typeid) {  
                this.typeid = typeid;  
            }  
            public ArticleType(String typeName,String note){  
                this.typeName=typeName;  
                this.note=note;  
                  
            }  
            public Integer getTypeid() {  
                return typeid;  
            }  
          
            public void setTypeid(Integer typeid) {  
                this.typeid = typeid;  
            }  
          
              
          
            public String getTypeName() {  
                return typeName;  
            }  
            public void setTypeName(String typeName) {  
                this.typeName = typeName;  
            }  
            public String getNote() {  
                return note;  
            }  
          
            public void setNote(String note) {  
                this.note = note;  
            }  
          
            public Boolean getVisible() {  
                return visible;  
            }  
          
            public void setVisible(Boolean visible) {  
                this.visible = visible;  
            }  
          
            public Set<ArticleType> getChildTypes() {  
                return childTypes;  
            }  
          
            public void setChildTypes(Set<ArticleType> childTypes) {  
                this.childTypes = childTypes;  
            }  
          
            public ArticleType getParent() {  
                return parent;  
            }  
          
            public void setParent(ArticleType parent) {  
                this.parent = parent;  
            }  
          
            public Set<ArticleInfor> getArticle() {  
                return article;  
            }  
          
            public void setArticle(Set<ArticleInfor> article) {  
                this.article = article;  
            }  
            @Override  
            public int hashCode() {  
                final int prime = 31;  
                int result = 1;  
                result = prime * result + ((typeid == null) ? 0 : typeid.hashCode());  
                return result;  
            }  
          
            @Override  
            public boolean equals(Object obj) {  
                if (this == obj)  
                    return true;  
                if (obj == null)  
                    return false;  
                if (getClass() != obj.getClass())  
                    return false;  
                final ArticleType other = (ArticleType) obj;  
                if (typeid == null) {  
                    if (other.typeid != null)  
                        return false;  
                } else if (!typeid.equals(other.typeid))  
                    return false;  
                return true;  
            }  
          
              
        }   
    Java代码  收藏代码    /**ͬ�����鼮�Ļ��� 
         *  
         */  
        package com.studysystem.model.article;  
          
        import java.io.Serializable;  
          
        import javax.persistence.Column;  
        import javax.persistence.Entity;  
        import javax.persistence.Id;  
        import javax.persistence.Table;  
          
        import org.compass.annotations.Index;  
        import org.compass.annotations.Searchable;  
        import org.compass.annotations.SearchableProperty;  
        import org.compass.annotations.Store;  
          
        /** 
         * @author zouqianheng 
         *2012-3-8 
         *TODO 
         */  
        @Entity @Searchable(root=false )@Table(name="brand")  
        public class Brand implements Serializable{  
          
            private static final long serialVersionUID = 1259058945967915466L;  
          
            @Id @Column(length=36)@SearchableProperty(index=Index.NO,store=Store.YES)  
            private String code;  
              
            @Column(name="name",length=40,nullable=false)  
            @SearchableProperty(index=Index.NOT_ANALYZED,store=Store.YES,name="brandName")  
            private String name;//���  
            @Column(name="visible",nullable=false)  
            private Boolean visible=true;//�Ƿ�ɼ�  
            @Column(name="logopath",length=80)  
            private String logopath;//logoͼƬ·��  
            public Brand(String code) {  
                this.code = code;  
            }  
          
            public Brand() {}  
              
            public Brand(String name, String logopath) {  
                this.name = name;  
                this.logopath = logopath;  
            }  
              
          
              
            public String getCode() {  
                return code;  
            }  
            public void setCode(String code) {  
                this.code = code;  
            }  
            public String getName() {  
                return name;  
            }  
            public void setName(String name) {  
                this.name = name;  
            }  
            public Boolean getVisible() {  
                return visible;  
            }  
            public void setVisible(Boolean visible) {  
                this.visible = visible;  
            }  
            public String getLogopath() {  
                return logopath;  
            }  
            public void setLogopath(String logopath) {  
                this.logopath = logopath;  
            }  
            @Override  
            public int hashCode() {  
                final int prime = 31;  
                int result = 1;  
                result = prime * result + ((code == null) ? 0 : code.hashCode());  
                return result;  
            }  
            @Override  
            public boolean equals(Object obj) {  
                if (this == obj)  
                    return true;  
                if (obj == null)  
                    return false;  
                if (getClass() != obj.getClass())  
                    return false;  
                Brand other = (Brand) obj;  
                if (code == null) {  
                    if (other.code != null)  
                        return false;  
                } else if (!code.equals(other.code))  
                    return false;  
                return true;  
            }  
        }   假设我不关联外键的话就可以测试成功但是我保存数据的使用保存不到aritclestype表里面去这个是我的junit的代码
    Java代码  收藏代码    @Test  
            public void testSave() {  
             // DAOInterface<ArticleInfor> articleInforDAO=(ArticleInforDAO)factory.getBean("articleInforDAO");  
             IArticleInforService um=(IArticleInforService) factory.getBean("articleInforService");  
                ArticleInfor article = new ArticleInfor ();  
                article.setId(1);  
                article.setArticleName("跟我学spring");  
                article.setClickcount(1);  
                article.setViewcount(1);  
                article.setBrand(new Brand("java"));  
                article.setViewcount(3);  
                article.setAuthorName("inewzone");  
                article.setCommend(true);  
          
                article.setDescription("比官方文档还要正确的知识体系讲解");  
                article.setContent("本书最大的特点:深入 详尽、解惑");  
                article.addArticleStyle(new ArticleStyle("155", "mmmm.gif"));  
                article.setCreateDate(DateUtil.datetime());  
                article.setType(new ArticleType(3));  
                  
                 um.save(article);  
                System.out.println(article.getId());  
            }