[英]Hibernate insert null values in composite foreign key
I have two simple domain objects as follows:我有两个简单的域对象,如下所示:
USER:用户:
@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
}
UserPK:用户PK:
public class UserPK implements Serializable {
@Column(name = "FISCALCODE")
private String fiscalCode;
@Column(name = "USERNUMBER")
private String userNumber;
// getter and setter
}
ITEMS:项目:
@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
}
DB Table:数据库表:
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);
}
Why when I run the command session.save(user)
Hibernate insert value null in the columns FISCALCODE
and USERNUMBER
of the ITEMS
table?为什么当我运行命令
session.save(user)
Hibernate 在ITEMS
表的FISCALCODE
和USERNUMBER
列中插入值 null 时?
I tried to set the ManyToOne
and the JoinColumns
on the getter, but the result is the same.我尝试在 getter 上设置
ManyToOne
和JoinColumns
,但结果是一样的。
EDIT: i have added my method for POST operation编辑:我添加了我的 POST 操作方法
@JoinColumns
:@JoinColumns
的文档中所述:When the
JoinColumns
annotation is used, both thename
and thereferencedColumnName
elements must be specified in each suchJoinColumn
annotation.使用
JoinColumns
注释时,必须在每个此类JoinColumn
注释中指定name
和referencedColumnName
的ColumnName 元素。
So, you should correct your mapping like below:因此,您应该更正您的映射,如下所示:
@ManyToOne
@JoinColumns({
@JoinColumn(name="FISCALCODE", referencedColumnName = "FISCALCODE"),
@JoinColumn(name="USERNUMBER", referencedColumnName = "USERNUMBER")
})
private User user;
So, you should have in your User
entity the addItem()
and removeItem()
utility methods that synchronize both ends whenever a child element is added or removed like below.因此,您应该在您的
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);
}
}
Example of saving:保存示例:
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.