我将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>
答案 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>