1
你好我是新來的休眠,並試圖找出如何將我的類正確映射回我的數據庫。 我與Struts 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
}
偵聽器(會話工廠)
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類假設映射到COLUMNS_INDEX表。 Data類假設映射到TABLE_INDEX表。在使用@OneToMany時,它是否將該對象保存到其指定的實體?這就是令我困惑的事情。謝謝 – dom
不按這個:@Table(name =「columns」)。將該實體映射到名爲「列」的表。 – raminr