2017-02-21 8 views
1

Здравствуйте, я новичок в hibernate и пытаюсь выяснить, как правильно сопоставить мои классы с моей базой данных. Я интегрируя это с распорками 2 и всякий раз, когда я пытаюсь сохранить объект, я получаю следующее сообщение об ошибке:Проблема с гибернацией (интеграция со 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) 

Все предложения приветствуются, я думаю, что мое отображение отменялось из-за мои вложенные столбцы объекта объект внутри моих данных класс. Объект Columns должен сохранять карту в другой таблице при сохранении объекта. Но, пожалуйста, дайте мне знать, что вы, ребята, думаете.

Вот мои POJO Классы:

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 
} 

Слушатель (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; 
} 
} 

Действие Метод:

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

ответ

0

Там нет ничего плохого в данных, указывая на Столбцы, а также в другую сторону. Вот как вы определяете связь между сущностями. Что вы подразумеваете под Объект Columns необходимо сопоставить с другой таблицей?

Это звучит как нарушение ограничений целостности внутри вашей базы данных.

+0

Класс Столбцы должен отображаться в таблице COLUMNS_INDEX. И класс Data предположительно должен отображаться в таблице TABLE_INDEX. При использовании @OneToMany он сохраняет этот объект в указанном объекте? Вот что меня смутило. спасибо – dom

+0

Не в соответствии с этим: @Table (name = "columns"). Это сопоставляет объект с таблицей, называемой «столбцы». – raminr

Смежные вопросы