我有这样的事情:
@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;
是可能的吗?
答案 0 :(得分:0)
我认为你可以:
1)创建两个不同的字段和不同的setter。
2)在方法级而不是字段上添加所有JPA注释。
3)从Spring 4.1开始,您可以对方法进行概要分析,因此请在setter上使用配置文件。
@Profile注释可以通过以下任何方式使用:作为直接或间接使用@Component注释的任何类的类型级注释,包括@Configuration类。作为元注释,用于组成自定义构造型注释。作为任何@Bean方法的方法级注释
答案 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应用程序上下文。尽管如此,一切都可行!