Здравствуйте, я новичок в 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
Класс Столбцы должен отображаться в таблице COLUMNS_INDEX. И класс Data предположительно должен отображаться в таблице TABLE_INDEX. При использовании @OneToMany он сохраняет этот объект в указанном объекте? Вот что меня смутило. спасибо – dom
Не в соответствии с этим: @Table (name = "columns"). Это сопоставляет объект с таблицей, называемой «столбцы». – raminr