2016-06-05 13 views
0

Ich schreibe erste App mit Frühling und überwintern Ich habe ein Problem mit vielen zu vielen Beziehung. Wenn ich Code ausführe, gibt es mir einen Fehler: Spalte subject0_subject_name existiert nicht. Es ist sehr seltsam für mich, weil mein Tisch subject nicht subject0 heißt. Im Folgenden Code meiner "Klasse" KlasseViele zu viele Beziehung "Spalte existiert nicht" Hibernate & Springboot

@Entity 
public class Class { 
@NotNull 
@Id 
@Column(name = "class_name") 
private String name; 

@Column(name = "start_year") 
private int startYear; 


@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "Class_has_Subject", joinColumns = {@JoinColumn(name = "class_name")}, inverseJoinColumns = {@JoinColumn(name = "subject_name")}) 
private Set<Subject> subject = new HashSet<Subject>(0); 

public Set<Subject> getSubject() { 
    return this.subject; 
} 


public void setSubject(Set<Subject> subject) { 
    this.subject = subject; 
} 

public int getStartYear() { 
    return startYear; 
} 

public void setStartYear(int startYear) { 
    this.startYear = startYear; 
} 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Class() { 
} 


} 

Gegenstand Klasse:

@Entity(name = "subject") 

public class Subject { 

@NotNull 
@Id 
@Column(name = "subject_name") 
private String name; 
@Column(name = "teacher") 
private String teacher; 
public Subject(String name, String teacher) { 
    this.name = name; 
    this.teacher = teacher; 
} 

public Subject() { 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public String getTeacher() { 
    return teacher; 
} 
public void setTeacher(String teacher) { 
    this.teacher = teacher; 
} 
} 

ClassRepository Schnittstelle:

public interface ClassRepository extends CrudRepository<Class,String> { 
List<Class> findByName(String name); 
} 

Classcontroller Klasse:

@Controller 

@EnableAutoConfiguration 

public class ClassController { 

@Autowired 
ClassRepository repo; 

@RequestMapping(value = "/class/get/{name}/", method = RequestMethod.GET) 
@ResponseBody 
public Set<Subject> getClass(@PathVariable String name) { 

    Class a= repo.findByName(name).get(0); 
    System.out.println(a.getStartYear()); 
    Set<Subject> s=a.getSubject(); 
    return s; 

} 

Antwort

-1

überprüfen Sie Ihre M anyToMany-Zuordnung für Betreff

+0

mehr Erklärung braucht. –

+0

geben Sie uns sql generiert durch überwintern –

+0

Können Sie mir sagen, wie das geht? – neir45

1

subject0_ ist der Name, den Hibernate Ihrer Tabelle gibt. Es ist nicht der tatsächliche Name der Tabelle. Also, wenn Hibernate versucht, Ihre Klasse Tabelle abzufragen wird es einen SQL-Befehl wie folgt

select 
     class0_.class_name as class_na1_2_, 
     class0_.start_year as start_ye2_2_ 
    from 
     public.class class0_ 
    where 
     class0_.class_name=? 

Note „class0_“ Konstrukt ist der Verweis auf die „Klasse“ Tabelle.

Wenn Sie Springboot verwenden, können Sie Hibernate so konfigurieren, dass diese SQL-Befehle zum Debuggen protokolliert werden, indem Sie die folgenden zwei Zeilen in Ihre application.properties einfügen.

spring.jpa.properties.hibernate.show_sql = true 
spring.jpa.properties.hibernate.format_sql = true 

In anderen Umgebungen wird der Ruhezustand konfiguriert.

Das gesagt, scheint es kein Problem mit Ihrem Mapping zu geben. Meine Vermutung ist, dass Ihre Betreff-Tabelle nicht die Spalte "subject_name" hat, weil Sie es nicht manuell hinzugefügt haben oder Hibernate es nicht hinzufügen kann, wenn Sie Ihre Anwendung starten.

Wenn Sie möchten, dass Hibernate Ihre Tabellen basierend auf Ihren Entitätsdefinitionen aktualisiert, können Sie dessen hbm2ddl-Funktionalität verwenden. Um dies zu tun in einer Frühlings-Boot-Anwendung sollten Sie die folgende Zeile in den application.properties haben:

spring.jpa.properties.hibernate.hbm2ddl.auto = update

Verwandte Themen