# Hibernate / SQL Fehlermenldung



## MQue (4. Okt 2009)

Hallo,
 ich setzte in meiner Application Spring und Hibernate mit einer mysql- Datenbank ein und bekommt untere Fehlermeldung, weiß jemand was ich dagegen machen kann?

Vielen Dank, 
lg



```
org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: could not insert: 
[com.roadrantz.domain.Rant]; uncategorized SQLException for SQL [insert into Rant (postedDate, 
rantText, vehicle_id) values (?, ?, ?)]; SQL state [HY000]; error code [1364]; Field 'id' doesn't have a 
default value; nested exception is java.sql.SQLException: Field 'id' doesn't have a default value
```

Die Tabelle Rant wurde in der Mysql- Datenbank so erzeugt:

```
create table Rant (
  id integer primary key,
  vehicle_id integer not null,
  rantText varchar(2000) not null,
  postedDate date not null
);
```

So wird  das Rant- Object erzeugt: 

```
Rant rant = new Rant();
    rant.setPostedDate(new Date());
    rant.setRantText("TEST RANT 3");
    Vehicle vehicle = new Vehicle();
    vehicle.setPlateNumber("J55DNY");
    vehicle.setState("TX");
    rant.setVehicle(vehicle);
    dao.saveRant(rant);
```


----------



## Wookie81 (4. Okt 2009)

Steht doch dort: Das Feld id hat keinen Standardwert!

Bei deinem neuem Rant Object wird die id nicht gesetzt und da sie eben keinen default/kein auto increment hat kommt diese Fehlermeldung. Äh wenn ich mich gerade richtig errinnere musst du bei deiner id annotieren, dass es eine id ist und von wem/wie sie generiert werden soll?!?

Wk


----------



## madboy (4. Okt 2009)

Du solltest das Feld "id" im SQL-Statement setzen bzw. von Hibernate setzen lassen. Vermutlich soll die ID automatisch (Sequenz o.ä.) gesetzt werden. 
Am besten zeigst du noch dein Hibernate-Mapping, dann lässt sich evtl. mehr sagen (wobei ich nicht der Hibernate-Experte bin) ;-)


----------



## MQue (5. Okt 2009)

OK, das hat funktioniert, 
jetzt hab ich ein anderes Problem, 
weiß vielleicht jemand, was ich da machen kann, ganz klar ist mir der Fehler nicht, ich weiß zwar, dass wahrscheinlich Vehicle nicht gespeichert werden kann und deshalb beim Speichern von Rant ein Fehler auftritt, aber was ich dagegen machen kann ist mir nicht klar. 
Wäre sehr dankbar für hilfe, 
lg



```
SCHWERWIEGEND: Could not synchronize database state with session
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the 
transient instance before flushing: com.roadrantz.domain.Vehicle
```


```
...
 ApplicationContext ctx = new FileSystemXmlApplicationContext("src/service.xml");
    
    HibernateRantDao dao = (HibernateRantDao) ctx.getBean("rantDao");
    
    Rant rant = new Rant();
    rant.setId(new Integer(1));
    rant.setPostedDate(new Date());
    rant.setRantText("TEST RANT 3");
    Vehicle vehicle = new Vehicle();
    vehicle.setPlateNumber("J55DNY");
    vehicle.setState("TX");
    rant.setVehicle(vehicle);
    dao.saveRant(rant);
```


```
public class Rant implements Serializable{
  private Integer id;
  private Vehicle vehicle;
  private String rantText;
  private Date postedDate;
  
  public Rant() {}

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getRantText() {
    return rantText;
  }

  public void setRantText(String rantText) {
    this.rantText = rantText;
  }

  @Temporal(TemporalType.DATE)
  public Date getPostedDate() {
    return postedDate;
  }

  public void setPostedDate(Date postedDate) {
    this.postedDate = postedDate;
  }

  @ManyToOne
  public Vehicle getVehicle() {
    return vehicle;
  }

  public void setVehicle(Vehicle vehicle) {
    this.vehicle = vehicle;
  }
  
  public boolean equals(Object o) {
    if (o instanceof Rant) {
      Rant rant = (Rant) o;
      return rant.id.equals(this.id);
    } else {
      return false;
    }
  }
  
  public int hashCode() {
    // TODO Auto-generated method stub
    return super.hashCode();
  }
}
```


```
public class Vehicle implements Serializable {
  private Integer id;
  private String state;
  private String plateNumber;
  private Motorist motorist;
  private List<Rant> rants;
  
  public Vehicle() {}

  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getPlateNumber() {
    return plateNumber;
  }

  public void setPlateNumber(String plateNumber) {
    this.plateNumber = stripNonAlphanumeric(plateNumber);
  }

  public String getState() {
    return state;
  }

  public void setState(String state) {
    this.state = state.toUpperCase();
  }
  
  
  @ManyToOne
  public Motorist getMotorist() {
    return motorist;
  }
  
  public void setMotorist(Motorist motorist) {
    this.motorist = motorist;
  }

  @OneToMany(targetEntity=Rant.class, 
      cascade=CascadeType.ALL, 
      mappedBy="vehicle")
  public List<Rant> getRants() {
    return rants;
  }

  public void setRants(List<Rant> rants) {
    this.rants = rants;
  }
  
  private String stripNonAlphanumeric(String in) {
    if(in == null) { return null; }
    
    StringBuffer outBuffer = new StringBuffer(in.length());
    
    for(int i = 0; i < in.length(); i++) {
      char c = in.charAt(i);
      if(Character.isLetter(c) || Character.isDigit(c)) {
        outBuffer.append(Character.toUpperCase(c));
      }
    }
    
    return outBuffer.toString();
  }
}
```


----------



## SlaterB (5. Okt 2009)

session.save(vehicle); 
vorher aufrufen


----------



## byte (6. Okt 2009)

oder save() kaskadieren


----------



## MQue (6. Okt 2009)

byte hat gesagt.:


> oder save() kaskadieren



Das wollte ich machen aber ich hab keine Ahnung wie das mit Annotations geht und wo ich das hinschreiben soll,

Vielen Dank,
lg


----------



## maki (6. Okt 2009)

Michael1234 hat gesagt.:


> Das wollte ich machen aber ich hab keine Ahnung wie das mit Annotations geht und wo ich das hinschreiben soll,


.. und leider gibt es ja überhaupt gar keine Doku zu JPA oder Hibernate also bist du vollkommen auf dich gestellt und kannst nur im Forum fragen..


----------



## MQue (6. Okt 2009)

maki hat gesagt.:


> .. und leider gibt es ja überhaupt gar keine Doku zu JPA oder Hibernate also bist du vollkommen auf dich gestellt und kannst nur im Forum fragen..


OK, vielleicht falsch ausgedrückt, wie das mit den Annotations geht weiß ich schon aber was ich nicht verstehe ist, dass es ja schon cascadiert ist:


```
@OneToMany(targetEntity=Rant.class, 
      cascade=CascadeType.ALL, 
      mappedBy="vehicle")
```

und ich deshalb nicht weiß wo ich das cascade noch hinschreiben muss.
lg


----------



## MQue (7. Okt 2009)

Nach einer langen Nacht hats geklappt,
lg


----------



## Unregistriert (21. Okt 2009)

Hallo, wie hat es denn geklappt?

Danke!

Gast


----------

