默认列值在休眠状态下不起作用

时间:2018-06-03 10:42:06

标签: java hibernate hibernate-mapping

我使用注释在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)

2 个答案:

答案 0 :(得分: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";

答案 1 :(得分:1)

每当要插入实体时,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将使用默认值的唯一方法是从insert语句的columns部分中省略该列。

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