Alter table dinamico

Boa noite pessoal!

Como posso fazer um alter table dinâmico com o Hibernate.

Estou construindo uma aplicação onde cadastro campos que na verdade serão colunas que eu preciso adicionar em uma tabela que já existe em tempo de execução.

Obrigado

Você tem uma unidade de persistência configurada?

Olá!

Não entendi a sua pergunta.

O seu projeto, de que tipo é? Ele usa uma unidade de persistência para configurar as conexões e as propriedades do hibernate?

Eu tenho uma classe mapeada da seguinte forma:

@Entity(name = "tb_custom_field")
@NamedQueries({ @NamedQuery(name = "CustomField.findAll", query = "SELECT cf FROM tb_custom_field cf"), })
public class CustomField implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@Column(name = "custom_field_id")
	@GeneratedValue(strategy = GenerationType.AUTO, generator = "seq_tb_custom_field_custom_field_id")
	@SequenceGenerator(name = "seq_tb_custom_field_custom_field_id", sequenceName = "seq_tb_custom_field_custom_field_id", allocationSize = 1)
	private long id;

	@Column(name = "custom_field_name", nullable = false)
	private String name;

	@Column(name = "custom_field_description", nullable = false)
	private String description;

	@Column(name = "custom_field_type", nullable = false)
	private String type;

	@Column(name = "custom_field_system", nullable = false)
	private boolean system;
	
	@Column(name="custom_field_required" ,nullable=false, columnDefinition="boolean default false")
	private boolean required;

	public boolean isRequired() {
		return required;
	}

	public void setRequired(boolean required) {
		this.required = required;
	}

	public long getId() {
		return id;
	}

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

	public String getName() {
		return name;
	}

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

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public boolean isSystem() {
		return system;
	}

	public void setSystem(boolean system) {
		this.system = system;
	}
}

Ai eu tenho uma outra classe que cuida de realizar a persistência.
Eu consegui adicionar a coluna utilizando

session.createSQLQuery("ALTER TABLE tb_customer ADD COLUMN " + customerField.getName() + " varchar(250)").executeUpdate();  

public class CustomFieldFacade {

	private CustomField customField;
	private List<CustomField> customFields;

	public CustomField getCustomField() {
		return customField;
	}

	public void setCustomField(CustomField customField) {
		this.customField = customField;
	}

	public List<CustomField> getCustomFields() {
		return customFields;
	}

	public void setCustomFields(List<CustomField> customFields) {
		this.customFields = customFields;
	}
	
	public void save(CustomField customerField) {
		EntityManager em = JPAUtil.getEntityManager();
		setCustomField(em.merge(customerField));
		
		Session session = null;
		try {
			session = (Session) em.getDelegate();
	        session.createSQLQuery("ALTER TABLE tb_customer ADD COLUMN " + customerField.getName() + " varchar(250)").executeUpdate();
		} catch(Exception e) {
			
		}
	}

	public CustomField alter(CustomField customerField) {
		setCustomField(CustomFieldDAO.find(customerField));
		return getCustomField();
	}

	public void delete(CustomField customerField) {
		EntityManager em = JPAUtil.getEntityManager();
		setCustomField(CustomFieldDAO.find(customerField));
		CustomField ref = CustomFieldDAO.find(customerField);
		em.remove(ref);
	}

	public List<CustomField> datagrid() {
		return CustomFieldDAO.getListCustomField();
	}
}

Meu projeto utiliza JSF 2.2, Hibernate, JPA, Banco de dados PostgreSQL