0

由于三天我尝试在 DB 中插入许多记录,我正在使用struts 2 and hibernate 3。我有 3 个表:

1 Evaluationglobale (id_eval ,label)
2 SousEval(id_eval ,SousItem_ID),
3 SousItems(SousItem_ID,label)

我的问题是如何在表 Evaluationglobale 中使用最后一个插入时在表 SousEval 中插入许多记录以id_eval获取更多解释我想做这样的事情:

表评估全球:

id_eval        label
----------------------------
1              evaluation 1

表 SousItems:

SousItem_ID   SousItem_Libelle
----------------------------
1              sousitem 1
2              sousitem 2
3              sousitem 3
4              sousitem 4

我想在 SousEval 中插入类似的东西

id_eval     SousItem_ID
----------------------------
1              1
1              2
1              3
1              4

而且我不知道如何SousItem_ID从这个 jsp 的迭代器中恢复一切:不认为我需要增加attribute nameof<s:select>但我不知道这是我的 jsp:

<form action="saveOrupdateSousEval" method="post">
    -----------------some code ------
    <TABLE  class="EvalTable" >
      <s:iterator value="item"  status="userStatus">
         <s:select  label="%{Item_Libelle}"
            headerValue="---------------- Select ---------------"
            headerKey="-1" 
            name="%{sousEvalItem.SousItem_ID}"  
            list="sousitem"
            listKey="SousItem_ID"  
            listValue="SousItem_Libelle"
            cssClass="tdLabelwidht"
            value="%{#request.name}"  
         />
    </s:iterator>
    </TABLE>
    <s:texfield type=hidden value="%{id_eval}" name="id_eval" />       
</form>

我的课 SousEvaluationDao :

public void saveOrUpdateSousEval(List<SousEvaluation> sousevalnote) {
try {
    for (Iterator<SousEvaluation> it = sousevalnote.iterator(); it.hasNext();) {
         session.saveOrUpdate(it.next());
    }
} catch (Exception e) {
    transaction.rollback();
    e.printStackTrace();
    }   
}

在我的班级行动中:

--------    
private List<SousEvaluation> sousevalnote=new ArrayList<SousEvaluation>();
private SousEvaluationDao sousevaldao=new SousEvaluationDaoImpl();
    ---
public String saveOrUpdateEval(){   
    sousevaldao.saveOrUpdateSousEvaluationNote(sousevalnote);
    return SUCCESS;
    }
4

1 回答 1

0

如果您尝试使用诸如此类的数据将许多值插入到表中,则可以单独使用 hibernate。

创建一个项目并添加所有休眠所需的 jar。因为我不确定您使用的 DB 类型,所以我可以提供一个使用 derby 数据库的示例。

您需要三个文件:1)配置文件:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
    <!-- Database connection settings -->
    <property name="connection.driver_class">org.apache.derby.jdbc.ClientDriver</property>
    <property name="connection.url">jdbc:derby://localhost:1527/EventDB;create=true</property>
    <property name="connection.username">user</property>
    <property name="connection.password">123</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">2</property>

    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.DerbyDialect</property>

    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>

    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>

    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>

    <!-- Names the Annotated Entity Class -->
    <mapping class="org.EventLogPrint.EventLog"/>


  </session-factory>
</hibernate-configuration>

2)您尝试在其中插入值的表的类:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;


@Entity(name="Event_Log")
public class EventLog {

    @Id
    @Column (name ="Event_Id")
    private int event_id;

    @Column (name="Run_Id")
    private int run_id;

    @Column (name="Job_Name")
    private String job_name;

    public int getEvent_id() {
        return event_id;
    }
    public void setEvent_id(int event_id) {
        this.event_id = event_id;
    }

    public int getRun_id() {
        return run_id;
    }
    public void setRun_id(int run_id) {
        this.run_id = run_id;
    }
    public String getJob_name() {
        return job_name;
    }
    public void setJob_name(String job_name) {
        this.job_name = job_name;
    }

}

3)插入值的类:

import java.text.ParseException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class TestEventLog {

    public static void main(String[] args) throws ParseException {

        Configuration config = new Configuration();
        config.configure();

        ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(config.getProperties());
        SessionFactory factory = config.buildSessionFactory(srb.buildServiceRegistry());

        Session session = factory.getCurrentSession();
        session.beginTransaction();

        for(int i = 1; i < 51; i++){            
            EventLog eventLog = new EventLog();
            eventLog.setEvent_id(100+i);
            eventLog.setJob_name("job name"+i);
            eventLog.setRun_id(1000+i);

            session.save(eventLog);
        }
        session.getTransaction().commit();
    }

}

根据要插入的对象数量更改 for 循环值。

不确定这是否是您想要采取的方法,但这是我知道的一种方法。

于 2013-08-29T16:01:52.807 回答