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
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
Nicht entsprechend: @Tabelle (Name = "Spalten"). Das ordnet diese Entität einer Tabelle namens "columns" zu. – raminr