我有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/

10-13 00:41