2010-08-09 80 views
1

我希望Hibernate 3.3.0通过在INSERTpersist())之前执行SELECT查询来生成值。这将这样的工作:Hibernate:由SQL查询生成的值

@Generated(GenerationTime.INSERT) 
@GenerateSQL("SELECT RANDOM() * 2") 
private int number; 

我看了一下@Generated(),这是很好的TRIGGER秒。我不想引入触发器。

我也看了@Formula,这是只读的。

那么,什么是标注的正确组合?谢谢。

回答

1

我想休眠3.3.0通过INSERT

我不认为这是支持前执行SELECT查询以生成一个值。

选择#1:您可以在代码中直接执行SELECT作为“创建”逻辑的一部分。

备选#2:使用休眠拦截器,提供对SessionFactory的引用,并在onSave从拦截器执行SELECT。

那么,什么是标注的正确组合?

设置默认值实际上得不到支持(请参阅HHH-4341),最简单的解决方案是IMO在列级别定义DEFAULT值。这将是我的替代#3。下面的例子:

@Generated(GenerationTime.INSERT) 
@Column(insertable=false, columnDefinition="INT DEFAULT 20") 
private int someNumber; 

我不知道这是一个选择,我不知道,如果在默认情况下使用RANDOM()会由数据库支持(怎么可能RANDOM() * 2成为int由办法?)。

+0

广告#1 - 嗯,我想我会在最后这一点。但是这需要我将交易提升到更高层次的抽象。 广告'RANDOM()''主场迎战int' - 好吧,你让我:)真正的使用情况是代发票号的这不单纯是一个序列(取消发票等) – 2010-08-10 03:56:58

+0

@Ondra我想这是一个例如:)但我明白了。尽管如此,我没有更好的建议。 – 2010-08-10 09:35:45