Hibernate试图插入到没有';甚至不存在于JavaWeb应用程序中
嗨,我正在尝试开发一个web应用程序,并且正在使用h2数据库。现在我正在学习一个类,它应该在我的表“Bewerteateabaen”中保存“Bewerteateabaen” 这是用于添加“bewertetetabage”的bean: 现在,当我尝试添加“bewerteteAbgabe”时,我得到以下消息:Hibernate试图插入到没有';甚至不存在于JavaWeb应用程序中,java,sql,hibernate,h2,dao,Java,Sql,Hibernate,H2,Dao,嗨,我正在尝试开发一个web应用程序,并且正在使用h2数据库。现在我正在学习一个类,它应该在我的表“Bewerteateabaen”中保存“Bewerteateabaen” 这是用于添加“bewertetetabage”的bean: 现在,当我尝试添加“bewerteteAbgabe”时,我得到以下消息: Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BEWERTETEABGABE_STUDENT" no
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BEWERTETEABGABE_STUDENT" not found; SQL statement:
insert into BEWERTETEABGABE_STUDENT (BewerteteAbgabe_ID, studenten_EMAIL) values (?, ?) [42102-200]
这是一个甚至不存在的表。
欢迎提供任何帮助,因为我已经尝试解决这个问题好几个小时了您的
bewertetababe
类和学生
类之间定义了一个多对多关系
@Setter
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.ALL})
@Fetch(值=FetchMode.SUBSELECT)
私人名单学生;
Hibernate试图用一个关系表对这种关系建模,该表包含每对学生和测试的一个条目。
该表将根据其连接的两个对象自动命名
尝试并创建表格,保存一些学生在其中的bewertetetababe
。您将在该表中看到类之间的连接
看一看。还有更详细的解释。谢谢您的回答。我已经添加了表,当我保存一个bewertetetabage时,另一个abgabe正在被保存,您可能知道这是为什么吗?您有一个带有
@manytone
和@JoinColumn
注释的字段abgabe
。保存包含Abgabe的BewerteteAbgabe时,Abgabe也会保存。原因是级联类型。全部。对父对象的所有操作都会传播到子对象。
@Entity
@Table(name = "BEWERTETEABGABE")
@NoArgsConstructor
public class BewerteteAbgabe {
/**
* ID einer bewerteten Abgabe
*/
@Id
@NonNull
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private int ID;
/**
* Abgabe, die bewertet wird
*/
@JoinColumn(name = "ABGABE")
@Getter
@Setter
@ManyToOne(cascade = {CascadeType.ALL})
private Abgabe abgabe;
/**
* Studenten, fuer die die Abgabe bewertet wird
*/
@Setter
@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
@Fetch(value = FetchMode.SUBSELECT)
private List<Student> studenten;
/**
* Tutoren, die bewerten
*/
@Setter
@Transient //TODO: Hier muss eine neue Tabelle eingefügt werden.
private List<User> tutoren;
/**
* Kommentar zur Bewertung
*/
@Getter
@Setter
@NotBlank
@NonNull
@Column(name = "KOMMENTAR")
private String kommentar;
/**
* Abgabenresultat eines Studenten
*/
@Getter
@Setter
//@Column(name = "RESULTAT")
@Transient //TODO: Neue Resultat-Tabelle joinen
private ZwischenBewertung.Resultat resultat;
/**
* Map zwischen der Aufgabe und ihrer Bewertung
*/
@Transient //TODO: Hier muss eine neue Tabelle eingefügt werden.
private Map<Aufgabe, BewerteteAufgabe> bewertung = new HashMap<>();
/**
* Konstruktor
*
* @param abgabe Zu bewertende Abgabe
* @param studenten Student, zu welchem Abgabe gehoert
* @param kommentar Kommentar zur Abgabe
*/
public BewerteteAbgabe(Abgabe abgabe, List<Student> studenten, String kommentar) {
this.abgabe = abgabe;
this.studenten = studenten;
this.kommentar = kommentar;
}
public BewerteteAbgabe(Abgabe abgabe, List<Student> studenten) {
this.abgabe = abgabe;
this.studenten = studenten;
}
/**
* gibt Tutoren zurueck, die Aufgabe korrigiert haben
*
* @return Tutoren, die korrigiert haben
*/
public List<User> getTutoren() {
return new ArrayList<>(this.tutoren);
}
/**
* gibt Studenten zurueck, die Abgabe gemacht haben
*
* @return Studenten der Abgabe
*/
public List<Student> getStudenten() {
return new ArrayList<>(this.studenten);
}
/**
* Fuegt die Bewertung zur Aufgabe hinzu.
*
* @param bewerteteAufgabe, die Bewertung
* @throws NullPointerException BewerteteAufgabe ist null
* @throws IllegalArgumentException wenn die {@link Aufgabe} nicht in der {@link Abgabe} vorhanden ist.
*/
public void addBewerteteAufgabe(BewerteteAufgabe bewerteteAufgabe) {
Objects.requireNonNull(bewerteteAufgabe);
if (!abgabe.containsAufgabe(bewerteteAufgabe.getAufgabe()))
throw new IllegalArgumentException(MessageFormat.format("Die ubergebene Aufgabe {0} ist nicht in der Abgabe {1} enthalten.", abgabe.getAufgaben(), abgabe));
bewertung.put(bewerteteAufgabe.getAufgabe(), bewerteteAufgabe);
}
/**
* entfernt Bewertung einer Aufgabe
*
* @param bewerteteAufgabe bewerteteAufgabe, die entfernt werden soll
* @return Erfolg
* @throws NullPointerException BewerteteAufgabe ist null
* @throws IllegalArgumentException Aufgabe ist nicht in Bewertung
*/
public boolean removeBewerteteAufgabe(BewerteteAufgabe bewerteteAufgabe) {
if (bewerteteAufgabe == null) {
throw new NullPointerException("bewerteteAufgabe ist null");
}
if (!(bewertung.containsKey(bewerteteAufgabe.getAufgabe()))) {
throw new IllegalArgumentException("Aufgabe ist nicht in Bewertung");
}
return this.bewertung.remove(bewerteteAufgabe.getAufgabe(), bewerteteAufgabe);
}
/**
* @param aufgabe Aufgabe, auf dessen Bewertung wir zugreifen wollen
* @return Bewertung der Aufgabe
* @throws NullPointerException Aufgabe ist null
* @throws IllegalArgumentException Aufgabe ist nicht in Abgabe
*/
public BewerteteAufgabe getBewerteteAufgabe(Aufgabe aufgabe) {
Objects.requireNonNull(aufgabe);
if (!abgabe.containsAufgabe(aufgabe))
throw new IllegalArgumentException(MessageFormat.format("Die ubergebene Aufgabe {0} ist nicht in der Abgabe {1} enthalten.", aufgabe, abgabe));
return bewertung.get(aufgabe);
}
/**
* berechnet Gesamtnote der Abgabe
*
* @return Gesamtnote
*/
public ZwischenBewertung erstelleZwischenBewertung() {
ErreichtePunkteAufgabenConsumer erreichtePunkteAufgabenConsumer = new ErreichtePunkteAufgabenConsumer(this);
for (Aufgabe hauptAufgabe : abgabe.getAufgaben())
hauptAufgabe.walkRecursiv(erreichtePunkteAufgabenConsumer);
return new ZwischenBewertung(abgabe, erreichtePunkteAufgabenConsumer.summePunkte);
}
/**
* Consumer, der ausrechnet wie viele Punkte gewichtet in einer Aufgabe erreicht wurden
*/
private static class ErreichtePunkteAufgabenConsumer implements Consumer<Aufgabe> {
/**
* Gewichtete erreichte Punkte
*/
public float summePunkte;
/**
* bewertete Abgabe fuer die Punkte summiert werden
*/
private final BewerteteAbgabe bewerteteAbgabe;
/**
* Konstruktor
*
* @param bewerteteAbgabe beweretete Abgabe
*/
public ErreichtePunkteAufgabenConsumer(BewerteteAbgabe bewerteteAbgabe) {
this.bewerteteAbgabe = bewerteteAbgabe;
}
/**
* Summiert die gewichteten Punkte fuer bewertete Aufgaben
*
* @param aufgabe Aufgabe, dessen erreichte Punkte summiert werden
*/
@Override
public void accept(Aufgabe aufgabe) {
BewerteteAufgabe bewerteteAufgabe = bewerteteAbgabe.getBewerteteAufgabe(aufgabe);
if (bewerteteAufgabe != null)
summePunkte += bewerteteAufgabe.getErreichtePunkte() * aufgabe.getGewichtKumuliert();
}
}
}
@Singleton
public class BewerteteAbgabeDAOImpl implements BewerteteAbgabeDAO {
@Override
public void insert(BewerteteAbgabe bewerteteAbgabe) throws NullPointerException {
HibernateUtil.execute(s -> s.save(bewerteteAbgabe));
}
@Override
public void update(BewerteteAbgabe bewerteteAbgabe) throws NullPointerException {
HibernateUtil.execute(s -> s.update(bewerteteAbgabe));
}
@Override
public void delete(BewerteteAbgabe bewerteteAbgabe) {
HibernateUtil.execute(s -> s.delete(bewerteteAbgabe));
}
@Override
public List<BewerteteAbgabe> alleBewerteteAbgaben() {
return HibernateUtil.find(s -> s.createQuery("from BewerteteAbgabe ", BewerteteAbgabe.class).list());
}
@Override
public Optional<BewerteteAbgabe> findById(int id) {
return HibernateUtil.find(s -> Optional.ofNullable(s.get(BewerteteAbgabe.class, id)));
}
}
CREATE TABLE `BewerteteAbgabe` (
`id` INT NOT NULL AUTO_INCREMENT,
`abgabe` INT NOT NULL,
`kommentar` varchar(255),
PRIMARY KEY (`id`)
);
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "BEWERTETEABGABE_STUDENT" not found; SQL statement:
insert into BEWERTETEABGABE_STUDENT (BewerteteAbgabe_ID, studenten_EMAIL) values (?, ?) [42102-200]