У меня есть следующая ситуация: в моем приложении два модуля: модуль 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?
Примечание: я просто использовал пример для простоты понимания.Реальный сценарий более сложный.