условная аннотация на спящий режим - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующая ситуация: в моем приложении два модуля: модуль A и модуль B. В моем приложении есть следующие таблицы: клиент, дилер, сделка, продукт и поставщик.

@Entity
@Table(name ="client")
public class Client {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CLIENT_ID", unique = true, nullable = false)
    private Long id;
    private String name;
    private String email;
    private String phone;

    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "DEALER_ID")
    private Dealer dealer;

    //getters and setters
}

@Entity
@Table(name ="dealer")
public class Dealer {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "DEALER_ID", unique = true, nullable = false)
    private Long id;
    private String name;
    private String email;
    private String phone;

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY, mappedBy = "dealer")
    private Set<Client> clients;

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY, mappedBy = "dealer")
    private Set<Deal> deals;

    //getters ans setters
}

@Entity
@Table(name ="deal")
public class Deal {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "DEAL_ID", unique = true, nullable = false)
    private Long id;

    @ManyToMany(cascade= {CascadeType.PERSIST, CascadeType.REFRESH, 
    CascadeType.MERGE},fetch= FetchType.LAZY)
    @JoinTable(name="deal_product",  joinColumns={
        @JoinColumn(name="DEAL_ID", nullable=false, updatable=false )},
        inverseJoinColumns = {@JoinColumn(name = "PRODUCT_ID", nullable=false, updatable = false)   })
    private Set<Product> products;


    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "DEALER_ID")
    private Dealer dealer;

   //getters ans setters
 }

@Entity
@Table(name ="product")
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PRODUCT_ID", unique = true, nullable = false)
    private Long id;
    private String name;
    private double price;

    @ManyToOne(fetch= FetchType.LAZY)
    @JoinColumn(name = "PROVIDER_ID")
    private Provider provider;

    //getters ans setters
}

@Entity
@Table(name ="provider")
public class Provider {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PROVIDER_ID", unique = true, nullable = false)
    private Long id;
    private String name;
    private String email;

    @OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY, mappedBy = "provider")
    private Set<Product> products;

    //getters and setters

}

Модуль A - это просто система расписаний, позволяющая клиенту найти контактную информацию своего дилера.Модуль B является системой управления дилером.

Для Hibernate для загрузки только таблиц, необходимых для каждого модуля, я создал конфигурацию во время выполнения следующим образом:

public class HibernateUtil {

    private static final SessionFactory sessionFactory = buildSessionFactory();

    private static SessionFactory buildSessionFactory() {
        try {
            Configuration cfg = new Configuration();
            cfg.setProperty("hibernate.connection.driver_class","????");
            cfg.setProperty("hibernate.connection.url","????");
            cfg.setProperty("hibernate.connection.username","????");
            cfg.setProperty("hibernate.connection.password","????");
            cfg.setProperty("hibernate.enable_lazy_load_no_trans","???");
            cfg.setProperty("hibernate.connection.pool_size", "???");
            cfg.setProperty("hibernate.dialect","?????");
            cfg.setProperty("hibernate.current_session_context_class","??");
            cfg.setProperty("hibernate.cache.provider_class","???");
            cfg.setProperty("hibernate.show_sql", "??");
            cfg.setProperty("hibernate.hbm2ddl.auto", "??");

            cfg.addAnnotatedClass(model.Client.class);
            cfg.addAnnotatedClass(model.Dealer.class); 

            if(module == "B") { 
                cfg.addAnnotatedClass(model.Deal.class);
                cfg.addAnnotatedClass(model.Dealer.class);
                cfg.addAnnotatedClass(model.Product.class);
                cfg.addAnnotatedClass(model.Provider.class);
            }
            return cfg.buildSessionFactory();

        }catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

Как видите, яможет частично разделить отображение по модулю.Но есть одна деталь, которую я не могу решить: при установке на клиенте в модуле A я не хочу, чтобы hibernate создавал таблицы «Сделка», «Продукт» и «Поставщик», а только «Клиент» и «Таблицы дилера, потому что для сценария А клиент должен просто знать контакты своего дилера.Однако, когда hibernate читает сущность Dealer, он жалуется, что класс Deal не сопоставлен.Поэтому я хотел, чтобы, когда hibernate считывал таблицы, он игнорировал строки, в которых я объявлял сделки.Есть ли способ игнорировать эти строки, если модуль A?

Примечание: я просто использовал пример для простоты понимания.Реальный сценарий более сложный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...