你好,我在一个不受spring上下文管理的自定义序列生成器上遇到了这个问题。
当我们迁移到hibernate 6以及spring-boot 3和spring 6时,这个问题就出现了。
- 问题 *
我似乎无法通过@Value
从客户生成器中的属性文件中获取值
我已将@Component
注解到我的CustomSequenceGenerator
,请参见下文
- CustomSequenceGenerator. java**
@Component
public class CustomSequenceGenerator extends SequenceStyleGenerator {
@Value("${value.from.property.file}")
private String valueFromPropFile;
@Override
public Serializable generate(...) {...}
}
- MyEntity. java**
@Entity
@Table(name="myentity")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_gen")
@GenericGenerator(
name = "seq_gen",
strategy = "com.demo.CustomSequenceGenerator",
parameters = {
@Parameters(name = "increment_size", value = "1")
}
)
private String id;
...
}
基于上面的代码片段,我的值valueFromPropFile
总是null。CustomSequenceGenerator
似乎不是由spring管理的。相反,hibernate是一个示例化它,这就是为什么我不能从@Value
获得值。
当我尝试显示对象本身时确认了这一点。
在CustomSequenceGenerator.java
中,在configure
方法中。我把一个日志和显示this
.与此同时,我在@RestController中的某个地方通过ApplicatonContext
getBean
方法登录了CustomSequenceGenerator
的示例。
结果表明,它们具有不同的记忆参考。因此,我可以推断它们有不同的情况。
- 问题**
所以我的问题是,我如何确保hibernate使用的CustomSequenceGenerator
示例与spring上下文中的示例相同。或者如何确保hibernate不示例化新的CustomSequenceGenerator
,而是使用spring上下文中的一个
2条答案
按热度按时间68bkxrlz1#
有没有什么特别的原因让你想把序列生成器变成bean?
只要它实现了
org.hibernate.id.IdentifierGenerator
(它确实实现了),您就应该能够通过使用@GenericGenerator
注解将增量逻辑应用于您想要的任何字段参考-https://thorben-janssen.com/custom-sequence-based-idgenerator/
我终于抽出时间来尝试复制你的问题,我能够让它工作的唯一方法是通过
-Dsequence-prefix=ex-prefix-
在jvm参数中传递一个值,然后在不使用spring的情况下拉取该属性值。在你的情况下:它有点丑,但嘿,它的工作
2skhul332#
我已经设法引用了基于这个question的spring应用程序上下文。
这个想法是,制作一个spring bean,它将注入一个
ApplicationContext
bean,并将其设置为ApplicationContext实用程序类。从那里,您可以使用应用程序上下文实用程序类访问应用程序上下文示例,并通过
applicationContext.getEnvironment().getProperty("prop.file.prefix")
获取属性字段值有关如何设置应用程序上下文配置,请参阅code reference
希望这能帮助每个人了解如何实现这种解决方案。
如果你有任何其他的想法来实现同样的,请把你的答案。我知道还有其他方法可以达到同样的目的。