【问题标题】:Hibernate inserting records in multiple tableHibernate在多个表中插入记录
【发布时间】:2014-10-30 04:31:14
【问题描述】:

我的场景是我有三个表格模板、问题和选​​择。

这里的模板将有很多问题,问题将有很多选择,选择表中的其他字段。

我在 Struts2 中使用单一表单来插入记录。我的问题是如何在休眠中配置???

谢谢!!!

@Entity
@Table(name="template")
public class Template {

@javax.persistence.Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="t_id")
private Integer Id;

private String temp;

@OneToMany(targetEntity=Question.class,  cascade=CascadeType.ALL)
@JoinColumn(name="tempId",  referencedColumnName="t_id")
private Set<Question> question;

//getter setter


 }

@Entity
@Table(name="question")
public class Question {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="Qid")
private Integer Qid;

private String question;

@ManyToOne
@JoinColumn(name="tempid")
private Template template;

@OneToMany(targetEntity=Choice.class, cascade=CascadeType.ALL)
@JoinColumn(name="qid", referencedColumnName="Qid")
private Set<Choice> choice;

//getter setter

}

@Entity
@Table(name="choice")
public class Choice {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer Id;

private String choice;

private String status;

private String description;

@ManyToOne
@JoinColumn(name="qid")
private Question question;

//getter setter

}

************控制器**********************

public class UserController extends ActionSupport implements ServletRequestAware{


HttpServletRequest request;

@Override
public void setServletRequest(HttpServletRequest request) {
    this.request =request;
}

Dao dao = new Dao();


Template template = new Template();

Question question = new Question();

Choice choice = new Choice();


public Choice getChoice() {
    return choice;
}


public void setChoice(Choice choice) {
    this.choice = choice;
}


public Question getQuestion() {
    return question;
}


public void setQuestion(Question question) {
    this.question = question;
}

public Template getTemplate() {
    return template;
}


public void setTemplate(Template template) {
    this.template = template;
}

public String insert(){
    System.out.println(choice);
    SessionFactory sf = Dbutil.getConnection();
    Session session = sf.openSession();
    Transaction tx =  session.beginTransaction();

    Choice ch1 = new Choice();
    ch1.setChoice(choice.getChoice());
    ch1.setStatus(choice.getStatus());
    ch1.setDescription(choice.getDescription());

    Set<Choice> chset =  new HashSet<Choice>();
    chset.add(choice);

    Set<Question> qns  = new HashSet<Question>();
    qns.add(question);

    Question q = new Question();
    q.setQuestion(question.getQuestion());
    q.setChoice(chset);

    Template t = new  Template();
    t.setTemplate(template.getTemplate());
    t.setQuestion(qns);

    dao.insertemplate(t,q, ch1);
    //session.save(t);
    //session.save(q);
    //session.save(ch1);

    tx.commit();
    session.flush();

    return "success";
}

}

************************DAO******************

    public class Dao {


    public void insertemplateT(Template template, Question qn1, Choice ch1 ){

    SessionFactory sf = Dbutil.getConnection();
    Session session = sf.openSession();
    Transaction tx =  session.beginTransaction();

    if(ch1!=null){
        insertChoice(ch1);
        if(qn1!=null){

            insertQuestion(qn1 );

            if(template !=null){
                session.save(template);
                tx.commit();
            }
        }
    }   

    }

    public void insertQuestion(Question qn1 ) {
    SessionFactory sf = Dbutil.getConnection();
    Session session = sf.openSession();
    Transaction tx =  session.beginTransaction();

    session.save(qn1);
    tx.commit();
    }



    public void insertChoice(Choice ch1) {
    SessionFactory sf = Dbutil.getConnection();
    Session session = sf.openSession();
    Transaction tx =  session.beginTransaction();
    session.save(ch1);
    tx.commit();
    System.out.println("committed");

    }



    }

***********sql 显示 ************

Hibernate:插入选择(选择,描述,qid,状态)值(?,?,?,?) 坚定的 Hibernate:插入问题(question,tempid)值(?,?) 休眠:插入选择(选择,描述,qid,状态)值(?,?,?,?) Hibernate:更新选择集 qid=? ID =? 休眠:插入模板(临时)值(?) Hibernate:插入问题(question,tempid)值(?,?) Hibernate:更新问题集 tempId=? Qid=?

******问题表图片******

【问题讨论】:

  • 使用一对多映射。
  • 在使用 1 到 n 时,我在问题表中得到重复插入,我不知道为什么?
  • 需要看看你在尝试什么。
  • 展示你如何插入/更新你的实体
  • @pomkine 请检查我更新的代码

标签: java hibernate struts2


【解决方案1】:
@Entity
@Table(name="template")
public class Template {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="t_id")
private Integer Id;

private String temp;

@OneToMany(mappedBy="template",  cascade=CascadeType.ALL)
private Set<Question> questions;

}




@Entity
@Table(name="question")
public class Question {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="Qid")
private Integer Qid;

private String question;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="tempid")
private Template template;

@OneToMany(mappedBy="question", cascade=CascadeType.ALL)
private Set<Choice> choices;

public void addChoice(Choice choice){
    choices.add(choice);
    choice.setQuestion(this);
}

public void setTemplate(Template template){
    this.template = template;
    template.getQuestions.add(this);
}


@Entity
@Table(name="choice")
public class Choice {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer Id;

private String choice;

private String status;

private String description;

@ManyToOne
@JoinColumn(name="qid")
private Question question;

}


Template template = //;
Choice choice = //;

Question question = new Question();
question.addChoice(choise);
question.setTemplate(template);

    public void insertQuestion(Question qn1) {
    SessionFactory sf = Dbutil.getConnection();
    Session session = sf.openSession();
    Transaction tx =  session.beginTransaction();

    session.save(qn1);
    tx.commit();
}

【讨论】:

  • 感谢 Alan 的回复。但它没有按我预期的方式工作。它不插入任何外键并再次在问题表中给出重复条目
  • 查看更新。设置了级联选项并设置了关系的双方,您应该能够进行一次调用来保存问题,并且应该保存其他所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-18
  • 2017-01-29
  • 1970-01-01
  • 2020-10-18
  • 2017-04-03
  • 1970-01-01
相关资源
最近更新 更多