Hibernate" Column ---不能为空

时间:2017-06-08 20:05:28

标签: java hibernate mapping jersey-2.0

我将Hibernate与phpmyadmin(MySQL)结合使用。 最近我发现了一个非常奇怪的错误。 每当我尝试插入一个新行(.persist)时,我都会收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'user_id' cannot be null

错误非常明显。 但奇怪的是,这个错误无处不在。 我完全确定属性userId(映射到' user_id')不为空。我测了好几次。 这是映射部分: (在@manytoone部分)。

  <property name="userId" update="false" insert="false" column="user_id" type="java.lang.Long" />

OneToMany部分不是我猜的问题。

所以这里的问题是,我100%确定该值不是空的,Hibernate仍将它作为null传递给MySQL。 (Getter确实有效)。

更新

@ManyToOne方面,导致错误

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="xx.xx.xx.AlarmEntity" table="alarms">
        <meta attribute="class-description">
            Hierin staan de object properties van de alarm entiteit.
        </meta>
        <id name="id" type="java.lang.Long" column="id">
            <generator class="native"/>
        </id>
        <property name="keepsRunning"  type="java.lang.Boolean">
            <column name="keeps_running" sql-type="int"></column>
        </property>
        <property name="userId" update="false" insert="false" column="user_id" type="java.lang.Long" />
        <many-to-one name="userAlarm" cascade="save-update" fetch="select" column="user_id" class="xx.xx.xx.UserEntity" />
    </class>
</hibernate-mapping>

2 个答案:

答案 0 :(得分:1)

请检查映射

<强> UserEntity

private int user_id;
private Set<AlarmEntity> alarm;

<强> AlarmEntity

private int alarm_id;
private String keepsRunning;

根据您的要求,我提供了带注释的映射,请检查

用户

@Id
@Column(name = "userId")
private Long userId;

// parent to Alarm
@Fetch(value = FetchMode.SELECT)
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "userId")
@JsonIgnore 
private List<Alarm> alarmList ;

<强>警报

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "alarmId")
private Long alarmId;


@ManyToOne
@JoinColumn(name = "userId", insertable = true, updatable = true, nullable = true)
private User user;

@Column(name="keepsRunning")
private String keepsRunning;

答案 1 :(得分:0)

提供对我有用的一对多示例的注释方法

在下面的示例中,工厂可以有多个产品,这意味着工厂和产品之间存在一对多映射,其中产品拥有此关系的一方,这意味着产品将维护用于保存工厂 ID 的外键约束。

表结构:

ptr<Employee> worker1(new Employee( /* ... */ ));

实体结构:

CREATE TABLE `factory` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `factory_name` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `product` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `factory_id` bigint NOT NULL ,
  `product_name` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

ALTER TABLE product
ADD CONSTRAINT FK_product_factory
FOREIGN KEY (factory_id) REFERENCES factory (id);

服务结构:

    @Entity
@Table(name = “factory”)
public class Factory {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name=“id”)
    private int id;

    @Column(name = "factory_name")
    private String factoryName;

    @OneToMany(mappedBy = “factory”,cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    private List<Product> products = new ArrayList<>();
}
@Entity
@Table(name = “product”)
public class Product {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private int id;

    @Column(name = “product_name")
    private String productName;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name=“factory_id")
    private Factory factory;
}

注意: 使用映射工厂保存产品。这里我们不需要专门保存产品,因为工厂正在维护级联,所以当我们保存工厂相关产品时也会保存,但我们只需要为每个产品对象设置 Fatory 以维护产品中的外键。< /p>