尊敬的开发者们。
我要问你一个问题,我觉得很难为我解决,只是因为我不知道为什么要回答,我的意思是什么??让我看看。JBoss文档中的关联没有得到全面的答案:为什么我应该使用JoinTable而不是外键,并且我不完全理解映射是如何工作的,我这样说是什么意思?我知道什么是协会是ManyToMany或ManyToOne等,他们的目的是什么,但他们如何工作和协作彼此不需要回答关于双向或单向或联合或协会,我想有一个链接,在那里我可以找到关于我的两个问题的全部信息:
1)为什么我应该使用JoinTable而不是外键????
2)实体之间是如何工作和协作的(没有解释什么是多、多等关联和双向或单向关联)???
所以,我有一段代码因为误会而被卡住了,我只是试图插入数据我是MYSQL数据库:Name_INSTITUTION和TYPE_NAME(Type of institution):*
>
我的实体类:
@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",
joinColumns=@JoinColumn(name="INSTITUTION_ID"),
inverseJoinColumns=@JoinColumn(name="TYPE_ID"))
public Type getType_inInstitution() {
return type_inInstitution;
}
public void setType_inInstitution(Type type_inInstitution) {
this.type_inInstitution = type_inInstitution;
}
}
我的第二个实体类:
@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", joinColumns=@JoinColumn(name="TYPE_ID"), inverseJoinColumns=@JoinColumn(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);
}
}
DAO类:
@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;
}
}
我的元数据配置:
<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>
null
和错误:
信息:org.springframework.beans.factory.XML.xmlbeandefinitionReader-从类路径资源[app-context.XML]加载XML bean定义信息:org.springframework.context.annotation.classpathbeandefinitionscanner-JSR-330“javax.inject.named”找到并支持组件扫描的注释信息:org.springframework.context.support.genericxmlapplicationcontext-刷新上下文层次结构的根信息:org.springframework.beans.factory.config.propertyplaceholderconfigureer-从类路径资源[connection.properties]加载属性文件信息:org.springframework.beans.factory.annotation.autowredanNotationbeanpostprocessor-JSR-330“javax.inject.inject”找到并支持自动生成信息:org.springframework.beans.factory.support.defaultlistablebeanfactory-在igurationAnnotationProcessor,org.SpringFramework.Context.Annotation.InternalAutoWireDanNotationProcessor,org.SpringFramework.Context.Annotation.InternalRequireDanNotationProcessor,org.SpringFramework.Context.Annotation.InternalCommonAnnotationProcessor,org.SpringFramework.Context.Annotation.InternalPersistenceNotationProcessor,sessionFactory,
null
谢谢你们,伙计们。
为什么我要使用可连接的外键?
你不应该。你有选择的余地。如果您喜欢使用联接表,请使用联接表。如果您更喜欢使用联接列(子表中的外键),请使用联接列。如果您有一个已经存在但无法更改的架构,请选择与现有架构相对应的选项。
实体之间如何工作和协作
我不知道你那是什么意思。如果一个实体学校与一个实体教师有一个OneToMany关联,那么当您从会话中获取一个学校并询问其教师时,Hibernate将为您从数据库中加载他们。如果将教师添加到学校的教师集合中,Hibernate将为您填充join列或join表。目标只是操作对象,就像它们是存储在内存中的简单对象一样,并将它们从数据库中Hibernate加载并保存到数据库中。
现在关于异常和你的问题的标题,异常消息说得很清楚:
插入类型(TYPE_NAME,VERSION)值(?,?)警告:org.hibernate.util.jdbcExceptionReporter-SQL错误:1048,SQLState:23000错误:org.hibernate.util.jdbcExceptionReporter-列“type_name”不能为空
您正在尝试插入一个类型类型(这是一个多么糟糕的名称!)名称为空。并且数据库列不允许为NULL。所以你得到了这个例外。如果null是有效的类型名称,则更改表定义,或者修复代码以确保不尝试插入null名称。
此外,尊重Java的命名公约。你的代码真的很难读。
问题内容: 下面是我的表结构 我正在执行查询,它向我显示列不能为空,这是我的查询 错误-列’physician_minc’不能为空 不是必填字段。我该如何解决这个问题? 问题答案: 您已将not null值定义为’physician_minc’: 如何将null值传递给它。首先,您需要将列设置为null,然后才可以传递所需的null值。
问题内容: 我创建了一个包含三列Id,Name,Quantity的表。看来,当我尝试插入至少包含一个空列的行或试图将列的默认值设置为NULL时,数据库会引发错误。 #1048-列“数量”不能为空 如何将NULL设置为列的有效值? 问题答案: 用您的实际数据类型替换,但没有限制。 要显示当前的列定义,请运行 在(命令行客户端)
以下是我的进口: 奇怪的是,它以前曾经工作过,我不知道发生了什么会影响这一点。
我每次点击提交按钮都会出现这个错误。其他所有内容都提交到数据库,只有图像没有提交。警告:file\u get\u contents():文件名不能为空。你知道吗?这是我的密码。
我是初学者(Java /JBOSS),我试图在JavaEE上启动JBOSS,但是当我从Eclipse启动服务器时,我总是遇到同样的错误: 使用JBoss7.1.1 “启动JBoss 7.1运行时服务器”期间发生内部错误。classToLaunch不能为null 或使用JBOSS EAP 6.1.0 “启动JBoss EAP 6.0运行时服务器”期间发生内部错误。classToLaunch不能为nu
当我尝试在手机的模拟器o中运行“app”时,使用Kotlin的android应用程序抛出了这个异常。当我构建我的项目时,它运行良好,没有错误。 我正在使用: SDK 28(Android 9.0(Pie)) 等级5.1.1 分级插件3.5.0-alpha03 Kotlin 1.3.10 Java 1.8.0_151 OSX 10.13.2