休眠,插入或更新而不选择

时间:2009-11-30 15:23:34

标签: hibernate select insert

我有一个产品对象属于某些类别,即经典的多对一关系。

@Entity
public class Product{

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    Long id;

    String name;
    Double price;
    @ManyToOne(fetch = FetchType.LAZY)
    Category category;
...
}

@Entity
public class Category implements Identifiable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String name;
...
}

我想在不预先选择类别的情况下插入和更新产品。像这样:

Product product = dao.get(productId);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.update(product);

Product product = new Product(somename);
Category category = dao.get(categoryId);
product.setCategory(category);
dao.insert(product);

是否可以在没有类别选择的情况下更新和插入?我不想使用HQL或直接查询。

3 个答案:

答案 0 :(得分:10)

session.load()专门针对此类案例而存在。以下内容:

Category category = session.load(categoryId);
product.setCategory(category);

不会命中数据库。但是,如果没有给定id的类别,它将在稍后阶段(在刷新期间或多或少)抛出异常。

使用load()merge()更快且没有副作用(级联等......)

答案 1 :(得分:2)

Hibernate需要一种安全的方法来确定对象的状态。这就是为什么它要确保你不能混合来自不同会话的对象(所以你不能在启动时加载类别然后再使用它们)。

解决方案是在启动时加载类别,为此类设置一个缓存提供程序,如ehcache,然后使用此代码:

Product product = new Product(somename);
product.setCategory(session.merge(category));

如果您配置类别实例无法更改的缓存,则不会导致任何数据库往返。

答案 2 :(得分:0)

我刚试过以下内容:

Category category = new Category(categoryId);
product.setCategory(category);

它有效,我的意思是db中的产品记录得到了正确的链接到类别和类别

categoryId

没有改变。