Hibernate und Enum Pattern

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Soll man Enums (Sammlungen von Konstanten) die man in seinem OO Model definiert hat auf der Datenbank ablegen?
Wenn ja wie könnte man das realiseren ?

Wie wär's damit?

Enum Colors
Code:
/*
 * Created on 07.01.2005@21:53:30
 *
 * TODO Licence info
 */
package de.tutorials.domain;

import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.ToStringBuilder;

/**
 * @author Administrator
 * 
 * TODO Explain me...
 * 
 * @hibernate.class table = "colors"
 *  
 */
public class Colors {

	private String id;

	private String name;

	public final static Colors RED = new Colors("FF0000", "RED");

	public final static Colors GREEN = new Colors("00FF00", "GREEN");

	public final static Colors BLUE = new Colors("0000FF", "BLUE");

	private Colors() {
	}

	private Colors(String id, String name) {
		this.id = id;
		this.name = name;
	}

	/**
	 * @return Returns the id.
	 * @hibernate.id generator-class = "assigned" column = "id" 
	 */
	public String getId() {
		return id;
	}

	/**
	 * @param id
	 *            The id to set.
	 */
	private void setId(String id) {
		this.id = id;
	}

	/**
	 * @return Returns the name.
	 * @hibernate.property column = "name" update = "false"
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name
	 *            The name to set.
	 */
	private void setName(String name) {
		this.name = name;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#toString()
	 */
	public String toString() {
		// TODO Auto-generated method stub
		return ToStringBuilder.reflectionToString(this);
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	public boolean equals(Object obj) {
		// TODO Auto-generated method stub
		if (!(obj instanceof Colors))
			return false;
		Colors c = (Colors) obj;
		return new EqualsBuilder().append(this.id, c.id).append(this.name,
				c.name).isEquals();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	public int hashCode() {
		// TODO Auto-generated method stub
		return new HashCodeBuilder().append(this.id).append(this.name)
				.hashCode();
	}
}

Das Hibernate Mapping File:
Code:
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping
>
    <class
        name="de.tutorials.domain.Colors"
        table="colors"
        dynamic-update="false"
        dynamic-insert="false"
        select-before-update="false"
        optimistic-lock="version"
    >

        <id
            name="id"
            column="id"
            type="java.lang.String"
        >
            <generator class="assigned">
              <!--  
                  To add non XDoclet generator parameters, create a file named 
                  hibernate-generator-params-Colors.xml 
                  containing the additional parameters and place it in your merge dir. 
              --> 
            </generator>
        </id>

        <property
            name="name"
            type="java.lang.String"
            update="false"
            insert="true"
            access="property"
            column="name"
        />

        <!--
            To add non XDoclet property mappings, create a file named
                hibernate-properties-Colors.xml
            containing the additional properties and place it in your merge dir.
        -->

    </class>

</hibernate-mapping>

Die MySQL Tabelle:
Code:
create table colors(id varchar(6) not null, name varchar(32) not null, PRIMARY KEY(id,name));

Werden die Werte nach dem initialen Einfügen noch einmal eingefügt bekommt man eine Hibernate-Seitige
java.sql.BatchUpdateException: Duplicate entry '00FF00-GREEN' for key 1

Welchen Vorteil hat diese Vorgehensweise gegenüber der einfach die Konstanten Werte "per Hand" in die Datenbank zu kehren, wobei man dort ohne irgendwelche Authorisationsschranken das "verändern" der Daten eigentlich nicht verhindern kann. Beim Enum Pattern auf Java Seite geht das schon... (okay man kann dort auch per Reflection heran, aber egal...)

Gruß Tom
 
Zurück