2017-02-21 2 views
1

Hallo, ich bin neu im Winterschlaf und versuche herauszufinden, wie ich meine Klassen korrekt in meine Datenbank zurückversetzen kann. Ich Integration diesen mit Streben 2 und wenn ich versuche, ein Objekt, das ich die folgende Fehlermeldung zu speichern:Hibernate Mapping-Problem (Integration mit Struts 2)

org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:112) 
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 

Alle Vorschläge sind willkommen, ich denke, mein Mapping off Objekt Columns Objekt in meinen Daten aufgrund meines verschachtelten ist Klasse. Das Columns-Objekt muss beim Speichern des Objekts einer anderen Tabelle zugeordnet werden. Aber lass mich bitte wissen, was ihr denkt.

Hier sind meine POJO Klassen:

Database.java

@Entity 
@Table(name = "database_index") 
public class Database implements Serializable{ 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name = "database_id") 
private int databaseId; 

@Column(name = "database_name") 
private String databaseName; 
// getters and setters 
} 

Data.java

@Entity 
@Table(name="table_index") 
public class Data { 
@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="table_id") 
private int tableIndex; 

@Column(name="table_name") 
private String tableName; 

@Column(name="table_type") 
private String tableType; 

@Column(name="table_description") 
private String tableDescription; 

@Column(name="legacy_name") 
private String legacyName; 

@Column(name="row_est") 
private String rowEst; 

@Column(name="delete_rule") 
private String deleteRule; 

@OneToMany(mappedBy="tId") 
private List<Columns> columns; 
// getters and setters 
} 

Columns.java

@Entity 
@Table(name="columns") 
public class Columns { 

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(name="column_id") 
private int columnId; 

@Column(name="field") 
private String field; 

@Column(name="type") 
private String type; 

@Column(name="nullable") 
private int nullable; 

@Column(name="pk") 
private int pk; 

@Column(name="fk") 
private int fk; 

@Column(name="index") 
private int index; 

@Column(name="status") 
private String status; 

@ManyToOne 
@JoinColumn(name="columns") 
private Data tId; 
// getters and setters 
} 

Listener (Session Factory)

public class DatabaseListener implements ServletContextListener{ 

private static SessionFactory sessionFactory = buildSessionFactory(); 

private static SessionFactory buildSessionFactory() { 
    try { 
     // Create the SessionFactory from hibernate.cfg.xml 
     return new Configuration().configure().addAnnotatedClass(Data.class).addAnnotatedClass(Database.class).addAnnotatedClass(Columns.class) 
       .buildSessionFactory(); 
    } catch (Throwable ex) { 
     System.err.println("Initial SessionFactory creation failed." + ex); 
     throw new ExceptionInInitializerError(ex); 
    } 
} 

public static SessionFactory getSessionFactory() { 
    return sessionFactory; 
} 

public void contextDestroyed(ServletContextEvent arg0) { 
    // TODO Auto-generated method stub 

} 

public void contextInitialized(ServletContextEvent event) { 

    try { 
      URL url = DatabaseListener.class.getResource("/hibernate.cfg.xml"); 
      Configuration config = new Configuration().configure(url); 
      sessionFactory = config.buildSessionFactory(); 

      //save the Hibernate session factory into serlvet context 
      event.getServletContext().setAttribute(DatabaseListener.class.getName(), sessionFactory); 
     } catch (Exception e) { 
      System.out.println(e.getMessage()); 
     } 

} 

}

DatabaseDAO.java

public class DataDAO extends DatabaseListener{ 

@SessionTarget 
Session session; 

@TransactionTarget 
Transaction transaction; 

@SuppressWarnings("unchecked") 
public List<Data> getData(){ 
    Session session = DatabaseListener.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    List<Data> data = new ArrayList<Data>(); 
    try{ 

     data = session.createQuery("from table_index").list(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
     session.getTransaction().rollback(); 
    } 
    session.getTransaction().commit(); 
    return data; 
} 

public Data addData(Data data){ 
    Session session = DatabaseListener.getSessionFactory().getCurrentSession(); 
    session.beginTransaction(); 
    session.save(data); 
    session.getTransaction().commit(); 
    return data; 
} 
} 

Aktion Methode:

public String addDatabase() throws Exception { 
    DatabaseDAO dao = new DatabaseDAO(); 
    System.out.println("In addDatabase function"); 
    System.out.println(getData()); 
    try { 
     System.out.println("try"); 
     dao.addDatabase(data); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
    System.out.println("finishing"); 
    getData(); 
    return SUCCESS; 
} 

Visual Representation of my Database

Antwort

0

Es ist nichts falsch mit Daten zeigt auf Spalten und auch den anderen Weg. So definieren Sie die Zuordnung zwischen Entitäten. Was meinst du mit Das Columns-Objekt muss einer anderen Tabelle zugeordnet werden?

Das klingt wie eine Integritätseinschränkungsverletzung in Ihrer Datenbank.

+0

Die Columns-Klasse soll der COLUMNS_INDEX-Tabelle zugeordnet werden. Und die Data-Klasse soll der Tabelle TABLE_INDEX zugeordnet werden. Wenn Sie @OneToMany verwenden, wird dieses Objekt in der angegebenen Entity gespeichert? Das hat mich verwirrt. danke – dom

+0

Nicht entsprechend: @Tabelle (Name = "Spalten"). Das ordnet diese Entität einer Tabelle namens "columns" zu. – raminr