Spring,hibernate实体字段取决于配置文件

时间:2017-06-06 11:43:53

标签: java spring hibernate

我有这样的事情:

@Entity
@Table(name = "schedules")
public class ScheduleDO {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;

@Column(name = "begin_time", columnDefinition = "TIMESTAMP WITH TIME ZONE", 
nullable = false)
private OffsetDateTime beginTime;
}

我希望能够改变" beginTime"基于活动轮廓的可变anotation。像这样:

   @Profile("dev")
   @Column(name = "begin_time_dev", columnDefinition = "TIMESTAMP WITH TIME ZONE", 
   nullable = false)
   @Profile("test")
   @Column(name = "begin_time_test", columnDefinition = "TIMESTAMP WITH TIME ZONE", 
   nullable = false)
   private OffsetDateTime beginTime;

是可能的吗?

3 个答案:

答案 0 :(得分:0)

我认为你可以:

1)创建两个不同的字段和不同的setter。

2)在方法级而不是字段上添加所有JPA注释。

3)从Spring 4.1开始,您可以对方法进行概要分析,因此请在setter上使用配置文件。

  

@Profile注释可以通过以下任何方式使用:作为直接或间接使用@Component注释的任何类的类型级注释,包括@Configuration类。作为元注释,用于组成自定义构造型注释。作为任何@Bean方法的方法级注释

PROFILE DOCS

答案 1 :(得分:0)

实际上JPA / Hibernate对弹簧一无所知,因此配置文件超出了它们的范围。此外,实体不是豆类,所以春天不会使用它们

我能看到的唯一解决方案是定义占位符{profile_begin_time_test}并添加拦截器(请参阅the example)。

方法

public String onPrepareStatement(String sql)

在hibernate生成的sql中,用所需的实际列名替换{profile_begin_time_test}占位符。可以将占位符替换配置为使用基于弹簧配置文件的值。

答案 2 :(得分:0)

您可以通过创建custom Hibernate UserType并通过Hibernate beginTime注释在@Type字段中注册来实现此目的。

在新的UserType中,您可以从Spring Environment获取当前配置文件以确定目标列名称。您必须首先以某种方式在应用程序中静态注册Environment,因为您的UserType将由Hibernate实例化,并且不会知道您的Spring应用程序上下文。尽管如此,一切都可行!