===================报错如下====================
Save alarm failed, alarmId: 2613376953_2992976297_3550058946_814791748, error: No default constructor for entity: : com.eastcom.aijud.fm.statistic.entity.AlarmTagEntity; nested exception is org.hibernate.InstantiationException
===================原因========================
封装了一个实体,却没有创建它的空构造器,或者是删除了默认构造器(空构造器)。
===================解决========================
给这个实体创建一个空构造器就可以了。
===================拓展分析====================
1、构造器的作用:定义了构建类的不同形式
无参的构造函数,只是为了比较好的构造类(new)。当你尝试通过一个无参的构造函数来构建(new)时,此时编译器才会报错,因为找不到这个无参的构造函数。
2、显示指定了一个带参的构造, 为了能实例这个类的对象 还需要显示指定一个无参构造。若没有,编译器默认创建一个空构造。
3、构造器的命名要与该类名一致。没有返回值也不需要加void。
4、构造器只能被调用,不能被继承。不然怎么解释第3条。
5、需要一个空的构造函数来通过持久性框架的反射来创建一个新实例。
6、Hibernate通过java反射构建bean时,需要用到这个无参构造器,下面代码中可以体现:
System.out.print(Class.forName("java.lang.String").newInstance().getClass().getName());
===================案例还原====================
@Data
@Entity
@Table(name = "FM_ALARM_TAG")
public class AlarmTagEntity implements Serializable {
@Id
@GenericGenerator(name = "uuid", strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String id;
@Column(name = "TAG_TYPE")
private String tagType;
@Column(name = "TAG_NAME")
private String tagName;
@ManyToOne
@JoinColumn(name = "AlarmId")
private FaultEntity faultEntity;
//添加默认构造器
public AlarmTagEntity() {
}
//有一个带参构造器
public AlarmTagEntity(String tagType,String tagName,FaultEntity faultEntity){
this.tagType = tagType;
this.tagName = tagName;
this.faultEntity = faultEntity;
}
}