У меня есть два класса, дочерний класс, который является сущностью, и суперкласс, который содержит @Id для сущности;как показано ниже.
По сути, он не может создать LocalContainerEntityManagerFactoryBean (код внизу), потому что не может найти @Id в суперклассе.Однако когда я удаляю расширение суперкласса из дочернего класса, оно работает.Любая помощь приветствуется, спасибо.
Суперкласс:
@MappedSuperclass
public class GeneralCampaign {
@Id
protected String id;
protected String campaignName;
protected String accountId;
protected String createdBy;
protected STATUS status;
public GeneralCampaign(){
this.id = ("cus-"+ UUID.randomUUID());
this.status = STATUS.DRAFT;
}
public GeneralCampaign(User userid,String accountId) {
this.id = ("cus-"+ UUID.randomUUID());
this.createdBy=userid.getId();
this.status = STATUS.DRAFT;
this.accountId=accountId;
//this.isEditing = false;
}
public GeneralCampaign(String campaignName, String accountId, User user) {
this.id = ("cus-"+ UUID.randomUUID());
this.campaignName = campaignName;
this.accountId = accountId;
if (user != null)
this.createdBy = user.getId();
}
// getter, setters
}
Дочерний класс:
@Entity(name = "local_search_campaign")
public class LocalSearchCampaign extends GeneralCampaign {
@Column(name = "start_date")
private Date startDate;
@Column(name = "end_date")
private Date endDate;
@Column(name = "time")
private java.util.Date timeStamp;
@Column(name = "campaign_guard_level")
private Integer campaignGuardLevel = 4;
@Column(name = "campaign_guard_enabled")
private Boolean campaignGuardEnabled;
@ElementCollection
@CollectionTable(
name = "local_search_campaign_keyword",
joinColumns=@JoinColumn(name = "local_search_campaign_id", referencedColumnName = "id")
)
@Column(name="keyword")
private List<String> keywords = new ArrayList<>();
@OneToMany(
mappedBy="localSearchCampaign",
orphanRemoval = true,
cascade = CascadeType.ALL,
fetch=FetchType.LAZY
)
private List<Location> locations = new ArrayList<Location>();
@Enumerated(EnumType.STRING)
private STATUS status;
@OneToOne(mappedBy = "campaign", cascade = CascadeType.ALL)
private LocalSearchPayment campaignPayment;
@Column(name="landing_page_choice")
private String landingPageChoice;
@Column(name="landing_page_URI")
private String landingPageURI;
@Column(name="last_updated")
private java.util.Date lastUpdated;
@Column(name="is_editing",columnDefinition="default 0")
private boolean editing = false;
private String discountCode;
public LocalSearchCampaign() {
super();
//this.id= ("LOC"+UUID.randomUUID().toString());
this.timeStamp = new java.util.Date() ;
//this.status=STATUS.DRAFT;
}
public LocalSearchCampaign(User userid,String accountId) {
super(userid, accountId);
/*this.id = ("cus-"+ UUID.randomUUID());
this.createdBy=userid.getId();
this.status = STATUS.DRAFT;
this.accountId=accountId;*/
//this.isEditing = false;
}
public LocalSearchCampaign(String campaignName, String accountId, User user) {
super(campaignName, accountId, user);
/*this.campaignName = campaignName;
this.accountId = accountId;
if (user != null)
this.createdBy = user.getId();*/
}
// getter, setters
}
Я создаю LocalContainerEntityManagerFactoryBean
как показано ниже
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean userEntityManager() {
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(userDataSource());
em.setPackagesToScan(new String[] { "com.packagename.etc"});
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
HashMap<String, Object> properties = new HashMap<>();
properties.put("hibernate.dialect",env.getProperty("spring.datasource.hibernate.dialect"));
properties.put("hibernate.hbm2ddl.auto",env.getProperty("spring.datasource.hibernate.hbm2ddl.auto"));
//properties.put("hibernate.format_sql", true);
//properties.put("hibernate.show_sql", true);
em.setJpaPropertyMap(properties);
return em;
}
Когда я не использую метод userEntityManager()
выше и просто использую значение по умолчанию, кажется, что он может найти @Id
суперкласса.