java 从spring上下文使用自定义序列生成器

mfpqipee  于 2023-06-20  发布在  Java
关注(0)|答案(2)|浏览(147)

你好,我在一个不受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中的某个地方通过ApplicatonContextgetBean方法登录了CustomSequenceGenerator的示例。
结果表明,它们具有不同的记忆参考。因此,我可以推断它们有不同的情况。

    • 问题**

所以我的问题是,我如何确保hibernate使用的CustomSequenceGenerator示例与spring上下文中的示例相同。或者如何确保hibernate不示例化新的CustomSequenceGenerator,而是使用spring上下文中的一个

68bkxrlz

68bkxrlz1#

有没有什么特别的原因让你想把序列生成器变成bean?
只要它实现了org.hibernate.id.IdentifierGenerator(它确实实现了),您就应该能够通过使用@GenericGenerator注解将增量逻辑应用于您想要的任何字段
参考-https://thorben-janssen.com/custom-sequence-based-idgenerator/
我终于抽出时间来尝试复制你的问题,我能够让它工作的唯一方法是通过-Dsequence-prefix=ex-prefix-在jvm参数中传递一个值,然后在不使用spring的情况下拉取该属性值。在你的情况下:

public class CustomSequenceGenerator extends SequenceStyleGenerator {
  private String valueFromPropFile = System.getProperty("sequence-prefix"); // "ex-prefix-"

  @Override
  public Serializable generate(...) {...}

}

它有点丑,但嘿,它的工作

2skhul33

2skhul332#

我已经设法引用了基于这个question的spring应用程序上下文。
这个想法是,制作一个spring bean,它将注入一个ApplicationContext bean,并将其设置为ApplicationContext实用程序类。
从那里,您可以使用应用程序上下文实用程序类访问应用程序上下文示例,并通过applicationContext.getEnvironment().getProperty("prop.file.prefix")获取属性字段值
有关如何设置应用程序上下文配置,请参阅code reference
希望这能帮助每个人了解如何实现这种解决方案。
如果你有任何其他的想法来实现同样的,请把你的答案。我知道还有其他方法可以达到同样的目的。

相关问题