Announcement Announcement Module
Collapse
No announcement yet.
Hibernate saving object Page Title Module
Move Remove Collapse
X
Conversation Detail Module
Collapse
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hibernate saving object

    Below is the code to save an object inside a MySql database:

    test. java
    -----------

    Code:
    import java.io.Serializable;
    import javax.persistence.Entity;
    import javax.persistence.Table;
    
    @Entity
    @Table(name="test")
    public class test implements Serializable{
    	
    	private static final long serialVersionUID = 1L;
    	private String data;
    
    	public String getData() {
    		return data;
    	}
    
    	public void setData(String data) {
    		this.data = data;
    	}
    }
    database.java
    ----------------

    Code:
    import java.sql.SQLException;
    import java.util.List;
    
    import org.hibernate.HibernateException;
    import org.hibernate.SQLQuery;
    import org.hibernate.Session;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.orm.hibernate3.HibernateCallback;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    
    public class database {
    	public static void main(String[] args){
    	   ApplicationContext ctx = new ClassPathXmlApplicationContext("database.xml");
           HibernateTemplate hibernate = (HibernateTemplate)ctx.getBean("hibernateTemplate");
           
           System.out.println(hibernate.executeFind(new HibernateCallback() {
        	   @Override
        	   public Object doInHibernate(Session session) throws HibernateException, SQLException {
        		   test a = new test();
        		   a.setData("john");
        		   session.save(a);
        		   SQLQuery query = session.createSQLQuery("select * from test");
        		   return query.list();
        	   }
    		}).size());
       }
    }
    However, I am getting the following unpleasant message:

    Code:
    May 2, 2011 1:16:45 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@17ace8d: display name [org.springframework.context.support.ClassPathXmlApplicationContext@17ace8d]; startup date [Mon May 02 13:16:45 SGT 2011]; root of context hierarchy
    May 2, 2011 1:16:45 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [database.xml]
    May 2, 2011 1:16:46 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
    INFO: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@17ace8d]: org.springframework.beans.factory.support.DefaultListableBeanFactory@8f4fb3
    May 2, 2011 1:16:46 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@8f4fb3: defining beans [hibernateTemplate,bkl.hib.SessionFactory,bkl.hib.DataSource,bkl.hib.HibernateConfig]; root of factory hierarchy
    May 2, 2011 1:16:47 PM org.hibernate.cfg.annotations.Version <clinit>
    INFO: Hibernate Annotations 3.2.0.GA
    May 2, 2011 1:16:47 PM org.hibernate.cfg.Environment <clinit>
    INFO: Hibernate 3.2.1
    May 2, 2011 1:16:47 PM org.hibernate.cfg.Environment <clinit>
    INFO: hibernate.properties not found
    May 2, 2011 1:16:47 PM org.hibernate.cfg.Environment buildBytecodeProvider
    INFO: Bytecode provider name : cglib
    May 2, 2011 1:16:47 PM org.hibernate.cfg.Environment <clinit>
    INFO: using JDK 1.4 java.sql.Timestamp handling
    May 2, 2011 1:16:47 PM org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
    INFO: Building new Hibernate SessionFactory
    May 2, 2011 1:16:47 PM org.hibernate.connection.ConnectionProviderFactory newConnectionProvider
    INFO: Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: RDBMS: MySQL, version: 5.5.9
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
    May 2, 2011 1:16:50 PM org.hibernate.dialect.Dialect <init>
    INFO: Using dialect: org.hibernate.dialect.SQLServerDialect
    May 2, 2011 1:16:50 PM org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
    INFO: Using default transaction strategy (direct JDBC transactions)
    May 2, 2011 1:16:50 PM org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
    INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Automatic flush during beforeCompletion(): disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Automatic session close at end of transaction: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Scrollable result sets: enabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: JDBC3 getGeneratedKeys(): enabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Connection release mode: on_close
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Default batch fetch size: 1
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Generate SQL with comments: enabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Order SQL updates by primary key: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory
    INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
    May 2, 2011 1:16:50 PM org.hibernate.hql.ast.ASTQueryTranslatorFactory <init>
    INFO: Using ASTQueryTranslatorFactory
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Query language substitutions: {}
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: JPA-QL strict compliance: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Second-level cache: enabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Query cache: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory createCacheProvider
    INFO: Cache provider: org.hibernate.cache.NoCacheProvider
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Optimize cache for minimal puts: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Structured second-level cache entries: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Statistics: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Deleted entity synthetic identifier rollback: disabled
    May 2, 2011 1:16:50 PM org.hibernate.cfg.SettingsFactory buildSettings
    INFO: Default entity-mode: pojo
    May 2, 2011 1:16:50 PM org.hibernate.impl.SessionFactoryImpl <init>
    INFO: building session factory
    May 2, 2011 1:16:50 PM org.hibernate.impl.SessionFactoryObjectFactory addInstance
    INFO: Not binding factory to JNDI, no JNDI name configured
    May 2, 2011 1:16:50 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: Running hbm2ddl schema update
    May 2, 2011 1:16:50 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: fetching database metadata
    May 2, 2011 1:16:50 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: updating schema
    May 2, 2011 1:16:50 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute
    INFO: schema update complete
    Exception in thread "main" org.springframework.orm.hibernate3.HibernateSystemException: Unknown entity: test; nested exception is org.hibernate.MappingException: Unknown entity: test
    Caused by: org.hibernate.MappingException: Unknown entity: test
    	at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548)
    	at org.hibernate.impl.SessionImpl.getEntityPersister(SessionImpl.java:1338)
    	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:96)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
    	at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
    	at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
    	at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
    	at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
    	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
    	at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
    	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.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1202)
    	at $Proxy1.save(Unknown Source)
    	at database$1.doInHibernate(database.java:22)
    	at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
    	at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:342)
    	at database.main(database.java:17)
    Last edited by solomon_13000; May 2nd, 2011, 07:43 PM.

  • #2
    Please [ code][/code ] tags that way your code/stacktrace/xml remains readable.

    Have you registered your entity with the sessionfactory, judging from the stacktrace you haven't.

    Comment


    • #3
      Is this what you meant:

      Code:
      <property name="annotatedClasses">
      <list>
          <value>org.test.entity.test</value>
      </list>
      </property>

      Regards.
      Last edited by solomon_13000; May 2nd, 2011, 07:43 PM.

      Comment


      • #4
        Please use [ code][/code ] tags !!! !!!

        Yes... Make sure that the package etc. are correct.

        Comment


        • #5
          I did try that. However the following information was displayed:

          Code:
          May 3, 2011 7:45:44 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
          INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1ca318a: display name [org.springframework.context.support.ClassPathXmlApplicationContext@1ca318a]; startup date [Tue May 03 07:45:42 SGT 2011]; root of context hierarchy
          May 3, 2011 7:45:47 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
          INFO: Loading XML bean definitions from class path resource [database.xml]
          May 3, 2011 7:45:49 AM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
          INFO: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@1ca318a]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1df38fd
          May 3, 2011 7:45:49 AM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
          INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1df38fd: defining beans [hibernateTemplate,bkl.hib.SessionFactory,bkl.hib.DataSource,bkl.hib.HibernateConfig]; root of factory hierarchy
          May 3, 2011 7:45:50 AM org.hibernate.cfg.annotations.Version <clinit>
          INFO: Hibernate Annotations 3.2.0.GA
          May 3, 2011 7:45:50 AM org.hibernate.cfg.Environment <clinit>
          INFO: Hibernate 3.2.1
          May 3, 2011 7:45:50 AM org.hibernate.cfg.Environment <clinit>
          INFO: hibernate.properties not found
          May 3, 2011 7:45:51 AM org.hibernate.cfg.Environment buildBytecodeProvider
          INFO: Bytecode provider name : cglib
          May 3, 2011 7:45:51 AM org.hibernate.cfg.Environment <clinit>
          INFO: using JDK 1.4 java.sql.Timestamp handling
          May 3, 2011 7:45:52 AM org.springframework.orm.hibernate3.LocalSessionFactoryBean buildSessionFactory
          INFO: Building new Hibernate SessionFactory
          May 3, 2011 7:45:52 AM org.hibernate.cfg.AnnotationBinder bindClass
          INFO: Binding entity from annotated class: org.test.entity.test
          May 3, 2011 7:45:52 AM org.hibernate.cfg.annotations.EntityBinder bindTable
          INFO: Bind entity org.test.entity.test on table test
          May 3, 2011 7:45:53 AM org.hibernate.connection.ConnectionProviderFactory newConnectionProvider
          INFO: Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: RDBMS: MySQL, version: 5.5.9
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.0.8 ( Revision: ${svn.Revision} )
          May 3, 2011 7:45:58 AM org.hibernate.dialect.Dialect <init>
          INFO: Using dialect: org.hibernate.dialect.SQLServerDialect
          May 3, 2011 7:45:58 AM org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
          INFO: Using default transaction strategy (direct JDBC transactions)
          May 3, 2011 7:45:58 AM org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
          INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Automatic flush during beforeCompletion(): disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Automatic session close at end of transaction: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Scrollable result sets: enabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: JDBC3 getGeneratedKeys(): enabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Connection release mode: on_close
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Default batch fetch size: 1
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Generate SQL with comments: enabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Order SQL updates by primary key: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory createQueryTranslatorFactory
          INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory
          May 3, 2011 7:45:58 AM org.hibernate.hql.ast.ASTQueryTranslatorFactory <init>
          INFO: Using ASTQueryTranslatorFactory
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Query language substitutions: {}
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: JPA-QL strict compliance: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Second-level cache: enabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Query cache: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory createCacheProvider
          INFO: Cache provider: org.hibernate.cache.NoCacheProvider
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Optimize cache for minimal puts: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Structured second-level cache entries: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Statistics: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Deleted entity synthetic identifier rollback: disabled
          May 3, 2011 7:45:58 AM org.hibernate.cfg.SettingsFactory buildSettings
          INFO: Default entity-mode: pojo
          May 3, 2011 7:45:58 AM org.hibernate.impl.SessionFactoryImpl <init>
          INFO: building session factory
          May 3, 2011 7:45:59 AM org.springframework.beans.factory.support.DefaultSingletonBeanRegistry destroySingletons
          INFO: Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1df38fd: defining beans [hibernateTemplate,bkl.hib.SessionFactory,bkl.hib.DataSource,bkl.hib.HibernateConfig]; root of factory hierarchy
          Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateTemplate' defined in class path resource [database.xml]: Cannot resolve reference to bean 'bkl.hib.SessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bkl.hib.SessionFactory' defined in class path resource [database.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
          Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'bkl.hib.SessionFactory' defined in class path resource [database.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
          Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
          	at net.sf.cglib.core.DebuggingClassWriter.<init>(DebuggingClassWriter.java:47)
          	at net.sf.cglib.core.DefaultGeneratorStrategy.getClassWriter(DefaultGeneratorStrategy.java:30)
          	at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:24)
          	at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
          	at net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
          	at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
          	at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
          	at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
          	at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
          	at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:107)
          	at org.hibernate.proxy.pojo.cglib.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:43)
          	at org.hibernate.tuple.entity.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:162)
          	at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:135)
          	at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
          	at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
          	at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:269)
          	at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:425)
          	at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
          	at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
          	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
          	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1291)
          	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.newSessionFactory(LocalSessionFactoryBean.java:805)
          	at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:745)
          	at

          I did include libraries such as asm.jar, asm.attrs-jar and cglib-2.1_3.jar in my project.

          Comment


          • #6
            Code:
            Caused by: org.springframework.beans.factory.BeanCreationException: 
            Error creating bean with name 'bkl.hib.SessionFactory' defined in class path
            resource [database.xml]: 
            Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: 
            org.objectweb.asm.ClassWriter.<init>(Z)V
            Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
            	at net.sf.cglib.core.DebuggingClassWriter.<init>
            I recall this wonderful case, was cumbersome to detect the cause

            I did include libraries such as asm.jar, asm.attrs-jar and cglib-2.1_3.jar in my project.
            The problem is about the asm versions, which has some conflicts with other dependency, I could say with Spring (not 100% sure), the error is not very clear like you see, in such days I was working with Core 3.0.2

            Which Spring Core version you are using?

            My solution was downloading from the Spring Repository many asm versions until to get one that work fine

            Try it

            HTH

            Comment


            • #7
              I'm using spring-framework-2.5.6.SEC02.

              Comment


              • #8
                To solve the problem I replaced asm.jar with asm-1.5.1.jar. Now it works!!

                Comment


                • #9
                  To solve the problem I replaced asm.jar with asm-1.5.1.jar. Now it works!!
                  Good! , I told you, I recall clearly this problem

                  BTW from where you get such jar?

                  Comment


                  • #10
                    I google for the jar file. Is it ok to post the link here?.

                    Comment

                    Working...
                    X