Das stimmt für die Referenz, an der mappedBy steht, weil in der Datenbank dafür keine Spalte angelegt wird.
Du kannst eigentlich alle name = „…“ in den Annotationen weglassen, weil sinnvolle Defaultwerte generiert werden. Interessant wird die manuelle Namensvergabe dann, wenn du bereits ein bestehendes Datenbankschema hast, an das du dich halten musst, oder ein Name generiert wird, der ein reserviertes Schlüsselwort in SQL ist.
Wenn du die name = „…“ weglässt und eine „leere“ Annotation übrig bleibt, dann kannst du sie auch ganz weglassen (gilt theoretisch auch für die @Table-Annotation).
Ich habe die Entity mal mit hibernate 4.3.6 getestet und sie funktioniert so (habe eigentlich nur die „überflüssigen“ Annotationen entfernt):
import java.util.Date;
import java.util.List;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@ManyToOne(fetch = FetchType.LAZY)
private User createdBy;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "createdBy")
private List<User> created;
@Column(nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date createdAt;
@Column(nullable = false)
private boolean blocked;
@Column(nullable = false)
private boolean deleted;
@Column(unique = true, nullable = false)
private String activcode;
private String firstname;
private String lastname;
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public User getCreatedBy() {
return createdBy;
}
public void setCreatedBy(User user) {
this.createdBy = user;
}
public Date getCreatedAt() {
return createdAt;
}
public void setCreatedAt(Date created_at) {
this.createdAt = created_at;
}
public boolean isBlocked() {
return blocked;
}
public void setBlocked(boolean blocked) {
this.blocked = blocked;
}
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
public String getActivcode() {
return activcode;
}
public void setActivcode(String activcode) {
this.activcode = activcode;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public List<User> getCreated() {
return created;
}
public void setCreated(List<User> created) {
this.created = created;
}
@Override
public String toString() {
return "User [id=" + id + ", created_by=" + createdBy
+ ", created=" + created + ", created_at=" + createdAt
+ ", blocked=" + blocked + ", deleted=" + deleted
+ ", activcode=" + activcode + ", firstname=" + firstname
+ ", lastname=" + lastname + ", email=" + email
+ ", password=" + password + "]";
}
}```
Mit MySQL 5.6.14 wird die Entity ordentlich generiert:
Hibernate: create table User (id integer not null auto_increment, activcode varchar(255) not null, blocked bit not null, createdAt datetime not null, deleted bit not null, email varchar(255) not null, firstname varchar(255), lastname varchar(255), password varchar(255) not null, createdBy_id integer, primary key (id))
Hibernate: alter table User add constraint UK_5l4pu99vbetwpbi945j6snbrs unique (activcode)
Hibernate: alter table User add constraint UK_e6gkqunxajvyxl5uctpl2vl2p unique (email)
Hibernate: alter table User add constraint FK_9w1lvibkjsisdbs0u3v05r138 foreign key (createdBy_id) references User (id)
Ein MS SQL Server stört sich allerdings an dem Tabellennamen "User" (deshalb oben das "theoretisch"):
Hibernate: create table User (id int identity not null, activcode varchar(255) not null, blocked bit not null, createdat datetime2 not null, deleted bit not null, email varchar(255) not null, firstname varchar(255), lastname varchar(255), password varchar(255) not null, createdby_id int, primary key (id))
2014-07-29 06:53:01,116 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: create table User (id int identity not null, activcode varchar(255) not null, blocked bit not null, createdat datetime2 not null, deleted bit not null, email varchar(255) not null, firstname varchar(255), lastname varchar(255), password varchar(255) not null, createdby_id int, primary key (id))
2014-07-29 06:53:01,117 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect syntax near the keyword ‚User‘.
Hibernate: alter table User add constraint UK_5l4pu99vbetwpbi945j6snbrs unique (activcode)
2014-07-29 06:53:01,133 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: alter table User add constraint UK_5l4pu99vbetwpbi945j6snbrs unique (activcode)
2014-07-29 06:53:01,134 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect syntax near the keyword ‚User‘.
Hibernate: alter table User add constraint UK_e6gkqunxajvyxl5uctpl2vl2p unique (email)
2014-07-29 06:53:01,135 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: alter table User add constraint UK_e6gkqunxajvyxl5uctpl2vl2p unique (email)
2014-07-29 06:53:01,136 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect syntax near the keyword ‚User‘.
Hibernate: alter table User add constraint FK_9alvrs7lvsj5lru1hgp703tda foreign key (createdby_id) references User
2014-07-29 06:53:01,158 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - HHH000389: Unsuccessful: alter table User add constraint FK_9alvrs7lvsj5lru1hgp703tda foreign key (createdby_id) references User
2014-07-29 06:53:01,158 ERROR org.hibernate.tool.hbm2ddl.SchemaExport - Incorrect syntax near the keyword ‚User‘.