# Hibernate mit final members



## perlenfischer1984 (24. Mai 2016)

Hallo ich habe folgende Frage :
Ich habe eine Klasse mit final membern und möchte diese über Hibernate speichern (in einer H2 datenbank).
HIer meine Klasse und mein erster Versuch : 

```
@Entity
@Access(AccessType.FIELD)
@Table(name = "association")
public class Association {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "name")
    private final String name;


    /**
     * @param id
     * @param name
     */
    public Association(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public Association(String name) {
        this.name = name;
    }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the name
     */
    public String getName() {
        return name;
    }


    /*
     * (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        return "Association [id=" + id + ", name=" + name + "]";
    }
}
```

Ich verwende eine H2 Datenbank mit 
	
	
	
	





```
hibernate.hbm2ddl.auto = update
```
. Damit wird die Datenbank nach Programmende nicht gelöscht. Wenn ich den Test mehr als einmal ausführe bekomme ich dann eine Exception () : No default constructor for entity:  : de.volleyball.databaseObject.Association


Kann mri jemand helfen ?
Vielen Dank


----------



## mrBrown (24. Mai 2016)

Die Fehlermeldung ist doch deutlich: No default constructor for entity 
Jede Klasse, die Hibernate laden soll, braucht einen Default-Konstruktor ohne Argumente - bei denen mit Argumenten kann Hibernate schließlich nicht wissen, was welches Argument ist.

Mit final fields kommt der afaik klar, die kann man Defaultwerte mit null initialisieren, Hibernate überschreibt das dann.


Klappt das mit int und @GeneratedValue?


----------



## perlenfischer1984 (25. Mai 2016)

Danke für deine Antwort. Und du hast Recht gehabt es lag tatsächlich am Default - Konstruktor. Was ich aber in diesem Zusammenhang nicht verstehe : das Attribut (name) ist final. Und es gibt keinen Setter dafür wie schafft es dann Hibernate den Wert zu setzten. Ich vermute über Reflection ? ODer wie geht das ?


----------



## stg (25. Mai 2016)

Ja, Hibernate macht das über Runtime Reflection. Es wäre aber z.B. auch möglich über die Annotationen gesteuert beim Compilieren den Bytecode zu ändern


----------

