EJB3, EntityBeans und Hibernate Annotations
Mit Hilfe von EJB3 können endlich Entity-Beans mit Hilfe von Annotations beschrieben werden. Nach der neusten und letzten Definition des Standards wird jetzt jedoch anhand der Stelle der Annotations (ob am Feld oder am Getter) entschieden womit der Persistenzmanager arbeitet. Dieses Verfahren darf jedoch nicht gemischt werden. Pro Entity muss man sich daher auf Field oder auf Getter festlegen. Anderenfalls kann es zu verwunderlichen Problemen kommen, die sich dann wie folgt äußern:
Caused by: java.sql.SQLException: Invalid column name 'createDate'.
Problem hierbei ist folgender Code:
@Entity @Table(name = "customers") public class Customer implements Serializable { private static final long serialVersionUID = 2005121501L; @Id @GeneratedValue(strategy=GenerationType.AUTO) @Column(name = “customer_id”) private int id; @Column(name = “customer_name”, nullable = false) private String name; private Date createDate; public int getId() { return id; } private void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Column(name = “create_date”, nullable = false) public Date getCreateDate() { return createDate; } public void setCreateDate(Date createdate) { this.createDate = createdate; } }
Hier wird die Annotation über getCreateDate ignoriert, da für die Klasse eine Fieldinvocation gewählt wurde. Ausschlaggebend dafür ist bei der Hibernateimplementierung wo der @ID-Tag steht. Die Folge ist daher, dass das Feld
private Date createDate;
implizit gemappt wird auf das Datenbankfeld “createDate”, welches nicht existiert.
EntityBeans sollten also mit größtmöglicher Sorgfalt überprüft werden.