gpt4 book ai didi

java - 除 I.D 外,没有数据添加到数据库中

转载 作者:行者123 更新时间:2023-12-01 13:23:56 27 4
gpt4 key购买 nike

我正在尝试添加用户在用户界面上选择的值。对于数据库中的特定列,我已经与数据库建立了连接,当我按“保存”时,新的 id 会添加到数据库中,控制台中不会显示任何错误,但我要提交的值不会放入数据库,我怎样才能实现这一点?

这是 GUI 的代码

                               <p:spinner id="ajaxspinner80-100" value="#{markingBean.spinnerNumber1}" 
stepFactor = "1" min="80" max="100" disabled = "#{formBean.number != 8}">
<p:ajax update="ajaxspinnervalue" process="@this" />
</p:spinner>
<p:commandButton action="#{markingBean.markSectionOne}" value="#{bundle.buttonSave}" update=":growl" icon="ui-icon-disk"/>

这会转到一个名为markingBean的bean

 private Marking markSectionOne;

private MarkingService markingService;

@Inject
private MarkingFacade markingFacade;

@PostConstruct
public void init() {
this.markSectionOne = new Marking();
}

public void markSectionOne() {
this.markingFacade.create(this.markSectionOne);
this.setMessage("Mark Saved");
}

abstractFacade中的创建类

public void create(T entity) {
getEntityManager().persist(entity);
}

这会导致将id添加到数据库中,但不会将markSectionOne标记添加到名为markSectionOne的列中,这是为什么,

用于标记的实体类是:

@Entity(name = "MARKING")
public class Marking implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String markingStage, markingCompleted, markSectionOne, markSectionTwo, markSectionThree, markSectionFour, markSectionFive, overalMark, plagorism, feedback, comments;

我收到错误的唯一一次是当我单击“保存”两次时,我在控制台中收到错误:

WARNING:   Local Exception Stack: 
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.0.v20130507-3faac2b): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL140219165944320' defined on 'MARKING'.
Error Code: -1
Call: INSERT INTO MARKING (ID, COMMENTS, FEEDBACK, MARKSECTIONFIVE, MARKSECTIONFOUR, MARKSECTIONONE, MARKSECTIONTHREE, MARKSECTIONTWO, MARKINGCOMPLETED, MARKINGSTAGE, OVERALMARK, PLAGORISM) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
bind => [12 parameters bound]

当有 12 列时,我是否只尝试添加一个值?

最佳答案

您有两个问题:

  1. 您没有在要插入数据库的对象的字段中填写数据。
  2. 您正在尝试插入与上一个事务中使用的相同对象,其中包含自动生成的 ID。由于此 id 是表的主键,因此当尝试插入具有已插入 id 的新行时,它会向您提供与重复的唯一键或主键相关的错误消息。这是错误消息的相关部分:唯一或主键约束中的重复键值

解决问题:

  1. 更改方法 markSectionOne 的名称。类中的任何方法都不应与其中的字段具有相同的名称。您可以将其更改为 saveMarkSectionOne 或有助于提高代码可读性的内容。
  2. 为类中的 markSectionOne 字段创建 getter 和 setter。这些方法通过 getXxxsetXxx(驼峰式大小写)来识别。在这种情况下,方法将如下所示:

    public Marking getMarkSectionOne() {
    return this.markSectionOne;
    }
    public void setMarkSectionOne(Marking markSectionOne) {
    this.markSectionOne = markSectionOne;
    }

    完成这些更改后,现在您可以使用 JSF 的强大功能轻松地将数据绑定(bind)到您的 View 。假设您的 Marking 类中有一个 int spinnerField 字段及其各自的 getter 和 setter,您可以将其绑定(bind)到 spinner 的值,如下所示:

    <!--
    This acts as markingBean.getMarkSectionOne.getSpinnerField() when rendering
    and as markingBean.getMarkSectionOne.setSpinnerField(spinner.getValue()) when sending the request to the server
    -->
    <p:spinner id="ajaxspinner80-100" value="#{markingBean.markSectionOne.spinnerField}"
    stepFactor="1" min="80" max="100" disabled="#{formBean.number != 8}">
    <p:ajax update="ajaxspinnervalue" process="@this" />
    </p:spinner>

    对 View 中的其他字段和组件执行类似的操作。

  3. 最后但并非最不重要的一点是,在将新实例插入数据库后,您还应该向 markSectionOne 字段分配一个新实例。您可以通过在 saveMarkSectionOne 方法中创建一个新实例来实现此目的:

    public void markSectionOne() {
    //supposing the data in markSectionOne is filled...
    this.markingFacade.create(markSectionOne);
    this.setMessage("Mark Saved");
    //after saving...
    markSectionOne = new Marking();
    }

关于java - 除 I.D 外,没有数据添加到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21888001/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com