пятница, 19 января 2018 г.

Intellij Edea File Template Entity without data base, as in Netbeans. Шаблон создания файла сущности в IDE Idea/

Давненько я свои заметки не публиковал :) Прошу прощения на форматирование текста, когда-нибудь я изменю шаблон и оберну весь код в спойлеры с красивым оформлением :)
На днях понял, что в Intellij Edea нет шаблона для создания обыкновенного файла сущности. Можно лишь создать его на основе таблицы в БД.
А вот если ты хочешь маппить данные в БД с помощью Hibernate, то создавать придется сначала класс, затем добавлять икьюалс, хешкод, туСтринг, геттеры, сеттеры, сериализацию, аннотации и т.д.

В Netbeans это делается в два клика, в Idea этого вообще нет, по крайней мере я долго искал и не нашел.
Недолго думая и имея в запасе немного время, создал шаблон.
По шагам, картинками и кодом, покажу как его добавить в свою Idea.
Есть в нем, конечно, недочеты, которые я бы устранил, возможно, будь у меня время и желание улучшать его дальше :)

Вот так сейчас выглядит в меню пункты для создания новых файлов, мы можете свой созданный шаблон назвать как угодно, у меня он назван просто Entity.
Ниже на скриншоте видно пункт:
Edit File Templates...
Сюда нам и нужно...




































Откроется окно, в нем жмем на плюс слева, переименовываем как хотим наш шаблон, а справа вставляем код на, как я понял, Apache Velocity:

#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;
@Entity #if (${Class_Name} != ${Class_Name}) (name=${Class_Name}) #end
public class ${Class_Name} implements Serializable {
   ##set ( $id_field_type = "Integer")
   private static final long serialVersionUID = 1L;
   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private ${id_field_type} id;
   
   public ${id_field_type} getId() {
        return id;
    }
    
    public void setId(${id_field_type} id) {
        this.id = id;
    }
        
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }
        
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof ${Class_Name})) {
            return false;
        }
        ${Class_Name} other = (${Class_Name}) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.${Class_Name}[ id=" + id + " ]";
    }
}

Обратите внимание на строку
##set ( $id_field_type = "Integer")
Если ее раскомментировать, т.е. убрать ОДИН символ решетки # в начале,
то вам не нужно будет при создании файла вводить значение переменной id_field_type.
#set ( $id_field_type = "Integer")
И окно при создании нашего файла Entity будет выглядеть не так:











А вот так:











Нам нужно будет ввести лишь имя, а поле id будет создано с типом Integer.
Как вы понимаете, если в коде шаблона изменить "Integer" на "Long", то и в созданном файле тип поля id будет с этим типом, т.е. по-умолчанию.
При закомментированной строке придется тип указывать ручками каждый раз при создании файла.
Кроме того, чтобы выглядело красиво можно вместо id_field_type ввести что-то типа Type_of_id_field и тогда в окне создания файла слева от поля будет Type of id field.

В итоге, мы получим в пару кликов и после ввода имени класса, например Contact, вот такой вот файл, который идентичен тому, что получается в Netbeans:

package com.opalev.models.contractor;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.io.Serializable;

@Entity
public class Contact implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Contact)) {
            return false;
        }
        Contact other = (Contact) object;
        if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "src.Contact[ id=" + id + " ]";
    }
}