当前位置: 首页 > 知识库问答 >
问题:

org.hibernate.exception.ConstraintViolationException:无法执行语句

鲁鹏
2023-03-14

我得到以下错误,当我尝试添加一个应用程序和应用程序设置。以下是详细的错误消息:

下面是junit测试

@Test
    public void testsSaveApps() {
        List<AppSetting> settings = new ArrayList<AppSetting>();
        //int settingid = types.getMaxSettingId()+1;
        settings.add(createSettingsOne());
        settings.add(createSettingsTwo());
        assertEquals(true,types.addTVappsWithSettings( 1,13, "App1", settings, "Danka" ) );

    }

    private static AppSetting createSettingsOne(){

        AppSetting setting = new AppSetting();
        setting.setCreated_by("Kasun");
        LocalDateTime time = new LocalDateTime();
        setting.setCreated_time(time);
        setting.setDisplayOrder(1);
        setting.setEditable(true);
        setting.setSettings_key("url");
        setting.setSettings_value("www.google.com");
        setting.setUpdated_time(time);
        setting.setUpdated_by("Kasun");
        //setting.setSettings_id(settingid);
        return setting;
    }
    private static AppSetting createSettingsTwo(){

        AppSetting setting = new AppSetting();
        setting.setCreated_by("Kasun");
        LocalDateTime time = new LocalDateTime();
        setting.setCreated_time(time);
        setting.setDisplayOrder(2);
        setting.setEditable(true);
        setting.setSettings_key("url2");
        setting.setSettings_value("www.CBC.com");
        setting.setUpdated_time(time);
        setting.setUpdated_by("Kasun");
        //setting.setSettings_id(settingid);

        return setting;
    }

这是保存应用程序和设置的方法

public boolean addTVappsWithSettings(int appTypeId,int companyid, String appName, List<AppSetting> settings, String createdBy) {
    //set properties of the app to persist
    App app = new App();

    //app.setSettings_id(settingid);
//  app.setSettings_id(settingid);
    app.setApp_id(appTypeId);
    app.setCompany_id(companyid);
    app.setApp_name(appName);
    app.setCreated_by(createdBy);
    LocalDateTime created_time = new LocalDateTime();
    app.setCreated_time(created_time);
    app.setUpdated_by(createdBy);
    app.setUpdated_time(created_time);
    app.setEnable(true);
    app.setapps(settings);
    session.save(app);
    if (!HibernateUtil.INSTANCE.commitTransaction())
        return false;
    return true;
}

这些是DAO类。

@Entity
@Table(name="company")
public class Company {
    @Id  //primary key
    @GeneratedValue(strategy = GenerationType.IDENTITY)//strategy for generating auto generated number
    @Column(name= "company_id", nullable = false)
    private int company_id; 

    @OneToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinColumn(name = "company_id", nullable = false)
    private List<App> threatviewapps = new ArrayList<App>();

    @NotEmpty
    @Column(name= "short_name", nullable = false)
    private String short_name;

    @NotEmpty
    @Column(name= "company_description", nullable = false)
    private String company_description;

    @NotEmpty
    @Column(name= "company_name", nullable = false)
    private String company_name;

    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name= "created_time", nullable = false)
    private LocalDateTime created_time;

    @Column(name= "created_by", nullable = false)
    private String created_by;

    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name= "update_time", nullable = false)
    private LocalDateTime update_time;

    @Column(name= "updated_by", nullable = false)
    private String updated_by; 

    @Column(name= "enable", nullable = false)
    private boolean enable;

这是应用刀

@Entity
@Table(name = "apps")
public class App {

    @Id // primary key
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "settings_id", insertable = false, updatable = false)
    private int settings_id;


    @Column(name = "app_id", nullable = false)
    private int app_id;

/*  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "settings_id", nullable = false)
    private List<AppSetting> tvsettings = new ArrayList<AppSetting>();*/

    @ElementCollection
    @CollectionTable(name="threatview_app_settings",joinColumns = @JoinColumn(name = "settings_id"))
    private List<AppSetting> tvsettings = new ArrayList<AppSetting>();


    @Column(name = "company_id", insertable = false, updatable = false)
    private int company_id;

    @Column(name = "app_name", nullable = false)
    private String app_name;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name = "created_time", nullable = false)
    private LocalDateTime created_time;

    @Column(name = "created_by", nullable = false)
    private String created_by;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updated_time;

    @Column(name = "updated_by", nullable = false)
    private String updated_by;

    @Column(name = "enable", nullable = false)
    private boolean enable;

为什么我会得到上面的错误?如果你们需要更多的信息,请告诉我。

更新

@Entity
@IdClass(SettingIDKey.class)
@Table(name = "app_settings")
public class AppSetting {


    @Id
    private int settings_id;

    @Id
    private String settings_key;


    @Column(name = "settings_value", nullable = false)
    private String settings_value;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name = "created_time", nullable = false)
    private LocalDateTime created_time;

    @Column(name = "created_by", nullable = false)
    private String created_by;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentLocalDateTime")
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updated_time;

    @Column(name = "updated_by", nullable = false)
    private String updated_by;

    @Column(name = "editable", nullable = false)
    private boolean editable;

    @Column(name = "enable", nullable = false)
    private boolean enable;

    @Column(name = "display_order", nullable = false)
    private int displayOrder;

共有1个答案

能文华
2023-03-14

在您的例子中,您已经将一个Tomany作为company_id的所有者。即Company类是拥有方。

在这个场景中,插入App记录会导致两个查询,一个是insert(插入),一个是UPDATE(更新)。首先是insert语句,它在没有company_id的情况下(因为它不是所有者)执行对App表的insert操作,然后它激发一个update查询来更新company_id。因此,要使第一个insert语句成功,它要求html" target="_blank">数据库中的company_id为空字段。否则它将抛出ConstraintViolationException。

如果您将ManyToOne设置为拥有方,则会在App表中产生单个insert语句。因此在这种情况下,company_id字段可以为null。

因此,我看到了两个选择:

  1. 将company_id设为数据库中的空字段。
  2. 将ManyToOne作为所有者。

下面的输出有助于理解上述语句。我有一个Forest类,它和Tree类有一个完全的关系。

多对一方拥有

Hibernate: values identity_val_local()
Hibernate: insert into Tree (id, "COUNT", FOREST, name, version) values (default, ?, ?, ?, ?)

一对多侧拥有

Hibernate: insert into Tree (id, "COUNT", name, version) values (default, ?, ?, ?)
Hibernate: values identity_val_local()
Hibernate: update Tree set FOREST=?, index=? where id=?
 类似资料:
  • 问题内容: 我在Hibernate尝试了简单的程序,并发现了一堆异常。 我不知道到底是什么问题。 我有三个课程-书籍,阅读器和使用。最后一个是将前两个绑定为一对多。 这是我的: 这是异常消息: 的摘要: DB上的所有表均已创建,但为空。一切都还好。有什么建议么? 如何解决这个麻烦? 问题答案: 在MySQL中, USING 是保留字。 因此,只需使用实体上的注释来重命名表即可。就像是 我假设您有一

  • 我刚开始使用hibernate编程,请帮帮我,我在执行下面的文件时遇到了问题。我使用的是MySQL数据库。我的错误是 SLF4J:未能加载类“org.slf4j.impl.StatibloggerBinder”。slf4j:默认为无操作(NOP)记录器实现slf4j:有关更多细节,请参见http://www.slf4j.org/codes.html#staticloggerbinder。Hiber

  • 我刚开始hibernate编程,请帮我一下,我在执行下面的文件时遇到了问题。我使用的是MySQL数据库。我的错误是 SLF4J:无法加载类“org.slf4j.impl.StaticloggerBinder”。slf4j:默认为无操作(NOP)记录器实现slf4j:请参阅http://www.slf4j.org/codes.html#staticloggerbinder了解更多详细信息。Hiber

  • 问题内容: 我正在尝试运行此代码并删除MySQL数据库中的某些记录,但出现此错误: 这是我目前拥有的代码: 我能够运行select *查询没有问题,但是当我尝试运行DELETE查询时,它并没有解决。我已经在MySQL工作台中运行了此命令,并且该命令有效,但是当我使用Java时,该命令不起作用。 问题答案: 您使用它代替。 仅用于返回数据的语句。适用于不会返回日期的日期(更新,插入,删除,我相信诸如

  • 我得到了"org.springframework.dao.数据完整性违反异常:无法执行语句;SQL[n/a];约束[null];嵌套异常是org.hibernate.exception.约束违反异常:无法执行语句"异常,同时将对象保存到存储库。 要求:计划将只有一个Cpricing对象,因此我添加了@OneToOne映射。下面是预期的表结构。 我在实体类中有以下代码更改: 当试图保存包含CPric

  • 问题内容: 仓库程序 JDBC程序 在执行上述程序时,程序出错。 Eroor: 问题答案: 设计用于与返回游标(通常是查询)的sql语句一起使用。您的调用不会返回游标,因此不适合与此方法一起使用。您应该只使用,然后从输出参数获取值: