我有RECEIPE表,而CUISINE_ID是CUISINE.ID表的外键。插入新的RECIPE时可能的,仅插入CUISINE_ID,而CUISINE表中没有新的行。
表结构
create table CUISINE(cuisine_id number primary key, name varchar2(20));
create table RECIPE(id number primary key,
name varchar2(25) not null,
cuisine_id number,
constraint cuisine_fk foreign key (cuisine_id) references
cuisine(cuisine_id));
类映射:
@Entity
@Table(name = "cuisine")
public class Cuisine {
@Id
@Column(name = "cuisine_id")
private int id;
@Column(name = "name")
@NotBlank(message = "You can not leave this empty.")
@NotNull(message = "You can not leave this empty.")
private String name;
@Entity
@Table(name = "recipe")
public class Recipe {
@Id
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "cuisine_id")
private Cuisine cuisine;
一旦从JSP页面填充了RECEIPE类,就可以从modelAttribute获得以下内容
Recipe [id=0, name=Burger, cuisine=Cuisine [id=0, name=American]
DAO代码是
public void addRecipe(Recipe recipe) {
String hql = "select max(id) from Recipe";
Integer id = ((Integer) getSession().createQuery(hql).uniqueResult()) + 1;
recipe.setId(id);
getSession().save(recipe);
}
从日志中,我可以看到正在插入以下内容:
Hibernate: insert into cuisine (name, cuisine_id) values (?, ?)
Hibernate: insert into recipe (cuisine_id, name, id) values (?, ?, ?)
我的要求是未在菜谱表中插入新行,因为recipe.cusinie_id应该仅存储ID。
提前致谢,
最佳答案
传递给您的DAO的Recipe对象可能包含对Cuisine对象的引用。我假设两个对象当时都未与会话关联。
您对Cuisine的引用的批注包含@OneToOne(cascade = CascadeType.ALL)
,告诉Hibernate也保存引用的Cuisine对象。这将导致您的insert into cuisine
语句。
您可能应该删除级联注释,因为当您删除食谱时,它还会导致菜式被删除。
另一种解决方案是从DB加载Cuisine对象,并在保存之前在Recipe中对其进行引用。 (但这仍然会让您拥有删除级联)
关于java - hibernate 一对一映射。仅插入外键,而不插入整个新行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26541493/