получение «org.hibernate.AnnotationException: идентификатор не указан для дочерней сущности:» при использовании @Id в суперклассе - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть два класса, дочерний класс, который является сущностью, и суперкласс, который содержит @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 суперкласса.

1 Ответ

0 голосов
/ 14 ноября 2018

Проверьте, находится ли ваш родительский класс в пакете com.packagename.etc.Кажется, что он не может найти его, также вы можете установить просто:

 em.setPackagesToScan(new String[] { "*"});//to scan all pacakges
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...