默认列值在休眠中不起作用

Posted

技术标签:

【中文标题】默认列值在休眠中不起作用【英文标题】:Default Column value is not working in hibernate 【发布时间】:2018-11-12 21:33:27 【问题描述】:

我使用注释在 Ben 中设置了“firm_name”默认值。 但是当我插入数据时,它会在数据库中添加NULL。 我想将默认值设置到数据库中,以便我只设置需要的值。 其他列值设置为默认值,设置为 Bean。 以下是我的代码。但它不起作用。我将在数据库中插入 nNULL 值。

@Entity
@Table(name = "my_leads")
public class My_leads

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id")
    int id;

    @Column(name = "name", length = 100,columnDefinition = "varchar(255) default 'NA'")
    String name;

    @Column(name = "enrtyDate", insertable = false, updatable = false, nullable = false,columnDefinition = "datetime default NOW()")
    Date enrtyDate;

    @Column(name = "mobileNo", nullable = false, length = 100)
    String mobileNo;

    @Column(name = "firm_name", length = 100, nullable = false,columnDefinition = "varchar(255) default 'No Refrence'")
    String firm_name;


    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public Date getEnrtyDate() 
        return enrtyDate;
    

    public void setEnrtyDate(Date enrtyDate) 
        this.enrtyDate = enrtyDate;
    

    public String getMobileNo() 
        return mobileNo;
    

    public void setMobileNo(String mobileNo) 
        this.mobileNo = mobileNo;
    


    public String getFirm_name() 
        return firm_name;
    

    public void setFirm_name(String firm_name) 
        this.firm_name = firm_name;
    




My_Leads lead=new My_Leads();
lead.setUser(1);
lead.setMobileNo("1234567896");
lead.setName("Sajan");
lead.setPriority(1);
lead.setStage(1);
lead.setCampain(1);
adminService.SaveLead(lead)

【问题讨论】:

你有没有通过hibernate从实体生成表 ***.com/questions/3110266/… 【参考方案1】:

您编写的代码不是通过 Hibernate 设置默认值的方法 - 它实际上是针对数据库的。

当您在数据库中创建表时,您可以定义一个列,如果您尝试插入空值,则会插入默认值。这就是你在这里所做的varchar(255) default 'No Refrence'

如果您的表已经创建,Hibernate 将忽略该语句。该语句仅在 Hibernate 使用 @Entity 类为您创建模式时使用。如果您进入数据库并检查列定义,您将看到您的列没有默认值,因为它不是由 Hibernate 创建的。

您可以删除您的架构并让 Hibernate 为您创建它,然后默认值将起作用。或者您可以手动编辑架构,将默认值添加到现有列。例如:

ALTER TABLE my_leads ALTER COLUMN firm_name SET DEFAULT 'No Refrence'

如果您让 Hibernate 生成您的架构并且仍然出现此错误 - 请确保这些实际上是空值,而不是 NULL 字符串或其他内容。

如果您不想让默认值由数据库插入,而是由 Hibernate 插入,请在 @Entity 类中执行此操作:

String firm_name = "No Refrence";

【讨论】:

【参考方案2】:

每当要插入实体时,Hibernate 都会生成以下 DML:

INSERT 
  INTO my_leads (id, name, enrtyDate, mobilNo, firm_name)
VALUES (?, ?, ?, ?, ?)

在您的 java 代码中,您根本没有为 firm_name 设置值,因此该属性为 null

是否使用列的默认值将取决于您使用的数据库平台以及在这种情况下它如何解释NULL

例如,mysql 将看到 Hibernate 将 NULL 绑定为 firm_name,因此将为您应用默认值,而不是将列设置为 NULL

例如,SQL Server 将看到 INSERT 语句在列部分包含字段 firm_name,因此将忽略默认值并使用值部分中提供的任何值,因此将设置列到NULL。 SQL Server 使用默认值的唯一方法是在插入语句的列部分省略该列。

无论您的数据库平台如何,确保设置默认值的唯一方法是确保您的实体状态也遵守该规则。这意味着您需要在字段定义、类的构造函数或构造实体的业务逻辑中使用默认值初始化 firm_name

【讨论】:

以上是关于默认列值在休眠中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

@Transactional 注释 rollbackFor 值在 Spring Boot 中不起作用

zeroDateTimeBehavior=convertToNull 在使用休眠的 jdbc url 中不起作用

逗号分隔值在 PHP MYSQL 中不起作用 [重复]

Tableview 文本字段中的 iOS 在 for 循环中获取值在 ios 7 中不起作用,但在 iOS 8 中起作用

HIbernate 批量插入或更新在 Spring Boot 中不起作用

为什么用户的输入值在批处理文件中的代码中不起作用? [重复]