[英]Hibernate insert null values in composite foreign key
我有两个简单的域对象,如下所示:
用户:
@Entity
@Table(name="USER")
@IdClass(UserPK.class)
public class User implements Serializable {
//...
@Id
@Column(name = "FISCALCODE")
private String fiscalCode;
@Id
@Column(name = "USERNUMBER")
private String userNumber;
@OneToMany(mappedBy="user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Items> items;
// getters and setters
}
用户PK:
public class UserPK implements Serializable {
@Column(name = "FISCALCODE")
private String fiscalCode;
@Column(name = "USERNUMBER")
private String userNumber;
// getter and setter
}
项目:
@Entity
@Table(name="ITEMS")
public class Items implements Serializable {
//...
@Id
@Column(name = "ID_ITEM")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "id_item_generator")
@SequenceGenerator( name = "id_item_generator", sequenceName = "ITEM_SEQ", allocationSize = 1)
private Integer id;
@ManyToOne
@JoinColumns({
@JoinColumn(name="FISCALCODE"),
@JoinColumn(name="USERNUMBER")
})
private User user;
// getters and setters
}
数据库表:
user { fiscalcode, usernumber, other columns... } // fiscalcode+usernumber = PK
items { id, fiscalcode, usernumber, other columns... } // fiscalcode,usernumber is a foreign key
CONTROLLER:
@RequestMapping(value="/user", method = RequestMethod.POST, produces = "application/json")
public Object postUser(@RequestBody(required = false) User user){
//connection etc..
session.save(user);
//...
return new ResponseEntity<>(HttpStatus.OK);
}
为什么当我运行命令session.save(user)
Hibernate 在ITEMS
表的FISCALCODE
和USERNUMBER
列中插入值 null 时?
我尝试在 getter 上设置ManyToOne
和JoinColumns
,但结果是一样的。
编辑:我添加了我的 POST 操作方法
@JoinColumns
的文档中所述:使用
JoinColumns
注释时,必须在每个此类JoinColumn
注释中指定name
和referencedColumnName
的ColumnName 元素。
因此,您应该更正您的映射,如下所示:
@ManyToOne
@JoinColumns({
@JoinColumn(name="FISCALCODE", referencedColumnName = "FISCALCODE"),
@JoinColumn(name="USERNUMBER", referencedColumnName = "USERNUMBER")
})
private User user;
因此,您应该在您的User
实体中使用addItem()
和removeItem()
实用方法,以便在添加或删除子元素时同步两端,如下所示。
@Entity
@Table(name="USER")
@IdClass(UserPK.class)
public class User implements Serializable {
//...
@OneToMany(mappedBy="user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private List<Items> items;
// getters and setters
public void addItem(Items item) {
this.items.add(item);
item.setUser(this);
}
public void removeItem(Items item) {
this.items.remove(item);
item.setUser(null);
}
}
保存示例:
User user = new User();
user.setFiscalCode("Code1");
user.setUserNumber("User1");
// ...
Items item1 = new Items();
Items item2 = new Items();
// ...
user.addItem(item1);
user.addItem(item2);
session.save(user);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.