繁体   English   中英

Hibernate映射问题(与Struts 2集成)

[英]Hibernate Mapping Issue (Integration with Struts 2)

您好我是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;
}

我的数据库的视觉表示

指向列的 数据和其他方式没有任何问题。 这是您定义实体之间关联的方式。 你是什​​么意思The Columns对象需要映射到不同的表

这听起来像是数据库中的完整性约束违规。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM