您好我是hibernate的新手,并试图弄清楚如何正确地将我的类映射回我的数据库。 我正在将它与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)
欢迎所有建议,我认为由于我的Data类中的嵌套对象Columns对象,我的映射已关闭。保存对象时,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;
}
答案 0 :(得分:0)
指向列的数据以及其他方式没有任何问题。这是您定义实体之间关联的方式。你是什么意思 Columns对象需要映射到另一个表?
这听起来像是数据库中的完整性约束违规。