2013-05-09 37 views
5

nhà phát triển thân yêu.Cột không thể rỗng không thể chèn

Tôi sẽ hỏi bạn một câu hỏi mà tôi nghĩ khó giải quyết cho tôi chỉ vì tôi không biết lý do cơ bản để trả lời, ý tôi là gì? Hãy xem. Các hiệp hội trong tài liệu JBoss không nhận được câu trả lời toàn diện: Tại sao tôi nên sử dụng JoinTable thay vì khóa ngoại và tôi không hoàn toàn hiểu cách ánh xạ hoạt động, Tôi có ý gì? Tôi biết liên kết là ManyToMany hoặc ManyToOne vv và cho mục đích gì, nhưng cách họ làm việc và cộng tác với nhau không cần câu trả lời về hai hướng hoặc một chiều hoặc liên kết hoặc hiệp hội, tôi muốn có liên kết nơi tôi có thể tìm thấy thông tin đầy đủ về hai câu hỏi của mình:

1) Tại sao tôi nên sử dụng JoinTable thay vì khóa ngoại ????

2) cách thức hoạt động của tổ chức và cộng tác với nhau (không giải thích liên kết manyToMany vv và liên kết hai hoặc hai chiều) là gì ???

Vì vậy, tôi có đoạn mã mà tôi bị mắc kẹt vì sự hiểu lầm, tôi chỉ cố gắng để chèn dữ liệu tôi cơ sở dữ liệu MYSQL: Name_INSTITUTION và TYPE_NAME (Loại hình tổ chức): *

  • thực thể của tôi lớp:

    @Entity 
    @Table(name="INSTITUTION") 
    
    public class Institution implements Serializable{ 
    
    private static final long serialVersionUID = -7636394097858726922L; 
    
    
    private int Id; 
    
        @Id 
        @GeneratedValue(strategy=IDENTITY) 
        @Column(name="ID") 
        public int getId() { 
         return Id; 
        } 
        public void setId(int id) { 
         Id = id; 
        } 
    
    
    private int Version; 
    
        @javax.persistence.Version 
        @Column(name="VERSION") 
        public int getVersion() { 
         return Version; 
        } 
        public void setVersion(int version) { 
         Version = version; 
        } 
    
    
    private String Name_Institution; 
    
        @Column(name="NAME_INSTITUTION") 
        public String getName_Institution() { 
         return Name_Institution; 
        } 
        public void setName_Institution(String name_Institution) { 
         Name_Institution = name_Institution; 
        } 
    
    
    private Type type_inInstitution; 
    
        @ManyToOne 
        @Cascade(org.hibernate.annotations.CascadeType.ALL) 
        @JoinTable(name="TYPE_INSTITUTION", 
                [email protected](name="INSTITUTION_ID"), 
                [email protected](name="TYPE_ID")) 
        public Type getType_inInstitution() { 
         return type_inInstitution; 
        } 
        public void setType_inInstitution(Type type_inInstitution) { 
         this.type_inInstitution = type_inInstitution; 
        } 
    

    }

  • lớp thực thể thứ hai của tôi:

    @Entity 
    @Table(name="TYPE") 
    
    public class Type implements Serializable { 
    
    
    private static final long serialVersionUID = -4246217431412815552L; 
    
    private String type; 
    
        public Type(){} 
    
        public Type(String type) { 
        this.type = type; 
    
        }  
    
    private int Type_Id; 
    
        @Id 
        @GeneratedValue(strategy=IDENTITY) 
        @Column(name="ID") 
        public int getType_Id() { 
         return Type_Id; 
        } 
        public void setType_Id(int type_Id) { 
         Type_Id = type_Id; 
        } 
    
    
    private String Type_Name; 
    
        @Column(name="TYPE_NAME") 
        public String getType_Name() { 
         return Type_Name; 
        } 
    
        public void setType_Name(String type_Name) { 
         Type_Name = type_Name; 
        } 
    
    
    private int Version; 
    
        @Version 
        @Column(name="VERSION") 
        public int getVersion() { 
         return Version; 
        } 
        public void setVersion(int version) { 
         Version = version; 
        } 
    
    
    
    private Set<Institution> set_Institution_inType = new HashSet<Institution>(); 
    
        @OneToMany 
        @JoinTable(name="TYPE_INSTITUTION",          [email protected](name="TYPE_ID"),           [email protected](name="INSTITUTION_ID")) 
        public Set<Institution> getSet_Institution_inType() { 
         return set_Institution_inType; 
        } 
        public void setSet_Institution_inType(Set<Institution> set_Institution_inType) { 
         this.set_Institution_inType = set_Institution_inType; 
        } 
    
        public void addType(Institution institution) { 
         institution.setType_inInstitution(this); 
           getSet_Institution_inType().add(institution); 
    
        } 
    

    }

    Các DAO Class:

    @Repository("daoInsertDataInterface") 
    @Transactional 
    
    public class InsertDataService implements DaoInsertDataInterface{ 
    
    private org.apache.commons.logging.Log log= LogFactory.getLog(InsertDataService.class); 
    
    private SessionFactory sessionFactory; 
    
        public SessionFactory getSessionFactory() { 
         return sessionFactory; 
        } 
    
        @Resource(name="sessionFactory") 
        public void setSessionFactory(SessionFactory sessionFactory) { 
         this.sessionFactory = sessionFactory; 
        } 
    
    
    @Override 
    public Institution insertData(Institution institution) { 
        sessionFactory.getCurrentSession().saveOrUpdate(institution); 
        log.info(institution.getId()); 
        return institution; 
    
    } 
    

    }

  • My metada config:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property> 
    <property name="url"><value>${jdbc.connectionValues}</value></property> 
    <property name="username"><value>${jdbc.userName}</value></property> 
    <property name="password"><value>${jdbc.password}</value></property> 
    </bean> 
    
    
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref ="sessionFactory"/> 
    </bean> 
    
    <context:property-placeholder location="connection.properties"/> 
    
    <tx:annotation-driven transaction-manager="transactionManager"/> 
    
    <context:component-scan base-package="edu.demidov.dom, edu.demidov.dao" /> 
    
    <context:annotation-config /> 
    
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref ="dataSource"/> 
    <property name="packagesToScan" value="edu.demidov.dom"/> 
    <property name="hibernateProperties"> 
    <props> 
    <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
    <prop key="hibernate.max_fetch_depth">3</prop> 
    <prop key="hibernate.jdbc.fetch_size">50</prop> 
    <prop key="hibernate.jdbc.batch_size">10</prop> 
    <prop key="hibernate.show_sql">true</prop> 
    </props> 
    </property> 
    
    </bean> 
    

  • .210
  • Và các lỗi:

INFO : org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loading XML bean definitions from class path resource [app-context.xml] INFO : org.springframework.context.annotation.ClassPathBeanDefinitionScanner - JSR-330 'javax.inject.Named' annotation found and supported for component scanning INFO : org.springframework.context.support.GenericXmlApplicationContext - Refreshing o[email protected]c93274: startup date [Thu May 09 11:38:23 EDT 2013]; root of context hierarchy INFO : org.springframework.beans.factory.config.PropertyPlaceholderConfigurer - Loading properties file from class path resource [connection.properties] INFO : org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring INFO : org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.s[email protected]1b9c2f0: defining beans [dataSource,transactionManager,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer#0,org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,daoInsertDataInterface,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,sessionFactory,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor];

root of factory hierarchy Hibernate: insert into TYPE (TYPE_NAME, VERSION) values (?, ?) WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000 ERROR: org.hibernate.util.JDBCExceptionReporter - Column 'TYPE_NAME' cannot be null Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not insert: [edu.demidov.dom.Type] 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:2327) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2834) at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:320) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) at org.hibernate.engine.Cascade.cascade(Cascade.java:161) at org.hibernate.event.def.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:450) at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:282) at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:203) at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:129) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:117) at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) at edu.demidov.dao.InsertDataService.insertData(InsertDataService.java:32) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:601) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317) 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$1.proceedWithInvocation(TransactionInterceptor.java:96) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) at $Proxy22.insertData(Unknown Source) at edu.demidov.dao.AppTEst.main(AppTEst.java:22) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'TYPE_NAME' cannot be null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:525) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.Util.getInstance(Util.java:386) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1041) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4120) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4052) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2503) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359) at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94) at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57) ... 44 more SS

Cảm ơn bạn, guys.

+0

+1 cho câu hỏi cực kỳ chi tiết. – Jops

Trả lời

2

Why I should use JoinTable insted of Foreign Key?

Bạn không nên. Bạn có sự lựa chọn. Nếu bạn thích sử dụng một bảng tham gia, hãy sử dụng một bảng nối. Nếu bạn thích sử dụng cột nối (khóa ngoài trong bảng con), hãy sử dụng cột nối. Nếu bạn có một lược đồ đã tồn tại mà bạn không thể thay đổi, hãy chọn tùy chọn tương ứng với lược đồ hiện có.

how entity work's and collaborate with each other

Tôi không chắc chắn ý bạn là gì.Nếu một trường thực thể có một hiệp hội OneToMany với một thực thể Giáo viên, khi bạn nhận được một trường học từ phiên, và yêu cầu giáo viên của mình, Hibernate sẽ tải chúng từ cơ sở dữ liệu cho bạn. Nếu bạn thêm một giáo viên vào bộ sưu tập giáo viên của một trường học, Hibernate sẽ điền vào cột kết nối hoặc bảng kết nối cho bạn. Mục tiêu chỉ đơn giản là để thao tác các đối tượng như thể theyr là các đối tượng đơn giản được lưu trữ trong bộ nhớ, và có tải Hibernate và lưu chúng cho bạn từ/đến cơ sở dữ liệu.

Bây giờ về ngoại lệ và tiêu đề của câu hỏi của bạn, thông điệp ngoại lệ nói rõ ràng:

insert into TYPE (TYPE_NAME, VERSION) values (?, ?) WARN : org.hibernate.util.JDBCExceptionReporter - SQL Error: 1048, SQLState: 23000 ERROR: org.hibernate.util.JDBCExceptionReporter - Column 'TYPE_NAME' cannot be null

Bạn đang cố gắng để chèn một antity loại Loại (những gì một tên xấu chọn!) Với một tên rỗng. Và cột cơ sở dữ liệu không đánh dấu null. Vì vậy, bạn nhận được ngoại lệ này. Hoặc thay đổi định nghĩa bảng nếu null là tên Type hợp lệ hoặc sửa mã của bạn để đảm bảo bạn không cố gắng chèn một tên null.

Ngoài ra, hãy tôn trọng các quy ước đặt tên Java. Mã của bạn thực sự khó đọc.

+1

Điều gì sẽ xảy ra nếu tôi có sự hợp tác giữa rất nhiều đối tượng hoặc đối tượng? Ví dụ: Tổ chức giáo dục (ManyToOne) <-> Loại (OneToMany), Type (ManyToMany) <-> DateOfInstitution (OneToMany) <-> Công nhân, tổ chức (ManyToMany) <-> DateOfInstitution (ManyToMany), DataOfInstitution (OneToMany) <-> Workers Nếu chúng ta có rất nhiều của (ManyToMany) Tổ chức giáo dục chủ sở hữu. Vì vậy, nếu tôi chèn dữ liệu của tất cả các đối tượng như Institution + Type + Workers + Date ?? Và sau khi tất cả tôi phải giải nén chúng tương ứng với DateOfInstitution + Type hoặc DateOfInstitution + Institution ??? Ở đây câu hỏi của tôi là: ** Cách thức hoạt động của thực thể và cộng tác với nhau **? – Alexandrovich

+0

Câu hỏi đó là quá mơ hồ để được trả lời. Mỗi hiệp hội hoạt động như tất cả những người khác. Một hiệp hội là một sự ám sát. Thực tế là nhiều tồn tại không thay đổi bất cứ điều gì về cách chúng hoạt động. Đặt câu hỏi cụ thể hoặc đọc tài liệu. –

+0

Cảm ơn bạn đã trả lời câu hỏi của bạn. Và tôi xin lỗi vì cách cư xử xấu của tôi làm phiền mọi người. – Alexandrovich

Các vấn đề liên quan