java.sql.SQLException:字段不';没有默认值
调用Spring Data JPA save()方法时,我遇到以下错误: --更新了SQL日志记录-- 下面是我调用save()方法的服务方法:java.sql.SQLException:字段不';没有默认值,java,mysql,spring,jpa,Java,Mysql,Spring,Jpa,调用Spring Data JPA save()方法时,我遇到以下错误: --更新了SQL日志记录-- 下面是我调用save()方法的服务方法: @覆盖 公共联系人addUser(UserForm UserForm){ 字符串编码密码; Contact user=userForm.getUser(); //对密码进行编码 encodedPassword=encoder.encode(userForm.getPassword()); //将编码的密码设置为密码 user.setPassword(e
@覆盖
公共联系人addUser(UserForm UserForm){
字符串编码密码;
Contact user=userForm.getUser();
//对密码进行编码
encodedPassword=encoder.encode(userForm.getPassword());
//将编码的密码设置为密码
user.setPassword(encodedPassword);
Set securityRoles=new HashSet();
//获得角色
add(roleDao.findById(userForm.getRoleId());
user.setRoles(securityRoles);
user.setTenantId(securityAccessor.getCurrentLoggedUser().getTenantId());
//现在保存
返回contactDao.save(用户);
}
我已经进行了检查,以确保“用户”对象属性(即firstName、lastName、tenantId)已填充,并且可以确认它们已填充
任何帮助都将不胜感激
以下是剩余的相关代码
联络类别:
@Entity
@Table(name = "contacts")
public class Contact implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name="CON_ID")
private int id;
@NotEmpty
@Column(name="CON_USERNAME")
private String username;
//Custom validation is carried out in controller class
@Column(name="CON_PASSWORD")
private String password;
@NotEmpty
@Column(name="CON_FIRST_NAME")
private String firstName;
@Column(name="CON_MIDDLE_NAME")
private String middleName;
@NotEmpty
@Column(name="CON_LAST_NAME")
private String lastName;
@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "USER_ROLES", joinColumns = {
@JoinColumn(name = "USER_CON_ID") }, inverseJoinColumns = {
@JoinColumn(name = "RLE_ID") })
private Set<Role> roles;
@Column(name = "TENANT_ENT_ID")
private int tenantId;
// @Column(name="ENT_ID")
// private int enterpriseId;
@Transient
private final String PERMISSION_PREFIX = "ROLE_PERM_";
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getMiddleName() {
return middleName;
}
public void setMiddleName(String middleName) {
this.middleName = middleName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<GrantedAuthorityImpl> authorities = new HashSet<GrantedAuthorityImpl>();
for (Role role : roles) {
for (Permission permission : role.getPermissions()) {
GrantedAuthorityImpl authority = new GrantedAuthorityImpl(PERMISSION_PREFIX + permission.getPermission());
authorities.add(authority);
}
}
return authorities;
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return true;
}
public String getPERMISSION_PREFIX() {
return PERMISSION_PREFIX;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
//custom method
public boolean hasPermission(String permission) {
for (Role role : this.roles) {
for (Permission securityPermission : role.getPermissions()) {
if (securityPermission.getPermission().equals(permission))
return true;
}
}
return false;
}
//custom method for testing - to rmeove
public boolean hasRole(String rle) {
for (Role role : this.roles) {
if (role.getRole().equals(rle))
return true;
}
return false;
}
public int getTenantId() {
return tenantId;
}
public void setTenantId(int tenantId) {
this.tenantId = tenantId;
}
}
@实体
@表(name=“contacts”)
公共类联系人实现UserDetails{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“CON_ID”)
私有int-id;
@空空如也
@列(name=“CON_USERNAME”)
私有字符串用户名;
//自定义验证在控制器类中执行
@列(name=“CON_密码”)
私有字符串密码;
@空空如也
@列(name=“CON\u FIRST\u name”)
私有字符串名;
@列(name=“CON_MIDDLE_name”)
私有字符串名称;
@空空如也
@列(name=“CON_LAST_name”)
私有字符串lastName;
@OneToMany(fetch=FetchType.EAGER)
@JoinTable(name=“USER\u ROLES”,joinColumns={
@JoinColumn(name=“USER\u CON\u ID”)},inverseJoinColumns={
@JoinColumn(name=“RLE_ID”)})
私人设定角色;
@列(name=“承租人”\u ENT\u ID)
私人国际租户;
//@Column(name=“ENT\u ID”)
//私营企业;
@短暂的
私有最终字符串权限\u PREFIX=“ROLE\u PERM”;
公共int getId(){
返回id;
}
公共无效集合id(内部id){
this.id=id;
}
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
公共字符串getFirstName(){
返回名字;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
公共字符串getMiddleName(){
返回中间名;
}
public void setMiddleName(字符串middleName){
this.middleName=middleName;
}
公共字符串getLastName(){
返回姓氏;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
@凌驾
公共收藏
显示租户ID列的Mysql“联系人”表的图像:
我刚刚遇到了同样的问题,在我的例子中,问题是我用@NotNull注释标记了实体中的一个属性,并且没有为它提供任何默认值。因此,删除表,删除注释,然后在不使用NotNull约束的情况下构造表,这一切对我来说都很好。Either在不使用NN(notNull)约束的情况下删除表并重建它,或者为TANENT_ENT_ID提供默认值(我不知道如何…在google中查找)将解决您的问题。对我来说,问题是,我在表中有一个额外的
id
字段,不能为null
。愚蠢的错误。在我的例子中,将数据库中的id字段设置为自动增量解决了问题。在我的例子中,问题是主键列没有设置为自动增量
我是这样解决的:
更改表格部门修改列id int非空自动增量;
更改表格名称修改列id int主键自动增量
在这种情况下,如果您要添加和自动增量,您必须应用任意一个键,如PK、Notnull等…来解决此问题…我通过将实体的GenerationType从“IDENTITY”更改为“AUTO”,并在数据库中将我的\u字段更改为“AUTOINCREMENT”属性来解决此问题。更新属性
**columnDefinition=“int default 1”**列中的
,默认值为1
@Column(name = "TENANT_ENT_ID", nullable = false, columnDefinition = "int default 1")
private int tenantId;
另一个配置使用xx.hbm.xml
将父项
和子项
列默认值都提到为1
@Column(name = "TENANT_ENT_ID", nullable = false, columnDefinition = "int default 1")
private int tenantId;
首先,您需要同时删除子表和父表,然后重新启动服务器(Tomcat)
parent.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Parent" table="PARENT">
<id name="parentId" type="long">
<column name="parentId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="userId" not-null="true">
<column name="userId" />
</property>
<property name="type" not-null="true" unique="true">
<column name="type" />
</property>
</class>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Child" table="CHILD">
<id name="childId">
<column name="childId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="parentId" column="parentId" />
<property name="description" not-null="true">
<column name="description" />
</property>
</class>
child.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Parent" table="PARENT">
<id name="parentId" type="long">
<column name="parentId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="userId" not-null="true">
<column name="userId" />
</property>
<property name="type" not-null="true" unique="true">
<column name="type" />
</property>
</class>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Child" table="CHILD">
<id name="childId">
<column name="childId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="parentId" column="parentId" />
<property name="description" not-null="true">
<column name="description" />
</property>
</class>
您能否打开SQL日志以查看数据库中的内容?当存在save(S实体)时,为什么要在存储库中定义save(Contact)
方法
crudepository
?另外,从您的屏幕截图来看,租户ID
似乎是您实际数据库中的外键,但没有映射到您的实体上?@pred-fragmaric我已经用SQL更新了我的问题logging@DonovanMuller我已删除save()方法。租户ID不是外键,因此在实体上没有这样的映射。无论如何,我已经运行了应用程序,但仍然遇到同样的问题。您是否有可能在GitHub等上安装一个小测试项目?同意
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Parent" table="PARENT">
<id name="parentId" type="long">
<column name="parentId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="userId" not-null="true">
<column name="userId" />
</property>
<property name="type" not-null="true" unique="true">
<column name="type" />
</property>
</class>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.data.Child" table="CHILD">
<id name="childId">
<column name="childId" default="1"></column>
<generator class="increment"></generator>
</id>
<property name="parentId" column="parentId" />
<property name="description" not-null="true">
<column name="description" />
</property>
</class>