@Entity
, и ещё не сохраняли его в БД. Если же сущность уже сохранена в БД, или считана из БД, то вместо интерфейса Map, объявленного в классе сущности, подставляется его реализация, связанная с функциями работы с БД. "Движок" JPA (обычно Hibernate) "видя", что на месте Map такая реализация, как бы "знает", что это связанные записи, которые уже сохранены в БД. Если же подменить целиком Map, то это "знание" теряется и начинается непредвиденное поведение.entity.getMap().put(...);
entity.getMap().remove(child);
нужно обновить частично, только один модульСоответственно, этот модуль должен быть самостоятельным артефактом Maven. Обычно, артефакт для EAR описывает формирование приложения из других модулей и конфигурационных файлов. Следует разбить приложение на артефакты (обычно jar/war), которые входят в состав EAR.
Как решается проблема, когда нужно иметь Singleton на нескольких серверах?
ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
import javax.persistence.*;
import java.io.Serializable;
@MappedSuperclass
public abstract class Identifier implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
protected Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Identifier that = (Identifier) o;
if (getId() != null) {
return getId().equals(that.getId());
} else {
return super.equals(o);
}
}
public int hashCode() {
return getId() != null ? getId().hashCode() : super.hashCode();
}
}
import javax.persistence.*;
@Entity()
@Table(name = "note")
public class Note extends Identifier {
//fields, getters, setters
}
технология RMI выдержит?практически любая технология выдержит, если выдержат Ваши аппаратные ресурсы. В основном это сеть и дисковая подсистема, но может быть и нагрузка на ОЗУ сервера приложений, т.к. многие технологии прежде чем сохранить файл на диск, загружают его байтовое представление в ОЗУ сервера. Насчёт "~1000 человек" - эта цифра ни о чём не говорит, в данном случае следует считать количество и размер загружаемых/скачиваемых файлов а не абстрактных пользователей.
Как правильно реализовать?Если Вы используете спецификацию JSF для построения клиентской части, то логично использовать средства загрузки файлов, предоставляемые библиотеками/фреймворками, реализующими эту спецификацию - практически все они имеют компоненты загрузки файлов на сервер. Я рекомендую использовать PrimeFaces - это активно развивающийся, богатый компонентами фреймворк. У них есть несколько вариантов компонента загрузки файла(-ов) на сервер, начать можно с этого
mail.smtp.host smtp.gmail.com
mail.smtp.socketFactory.port 465
mail.smtp.socketFactory.class javax.net.ssl.SSLSocketFactory
mail.smtp.auth true
mail.smtp.port 465
mail.sender.email mymail@gmail.com
mail.sender.email.password mypassword
mail.smtp.ssl.enable true
mail.smtp.ssl.trust *
public static void main(String[] args) throws Exception {
String fieldName = "myField";
//создание тестового индекса
Directory directory = new RAMDirectory();//в "настоящей" Системе здесь должно быть FSDirectory.open(dir)
RussianAnalyzer analyzer = new RussianAnalyzer(Version.LUCENE_46);
IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_46, analyzer);
IndexWriter writer = new IndexWriter(directory, config);
writer.addDocument(createDocument(fieldName, "Я живу у мамы"));
writer.addDocument(createDocument(fieldName, "В доме было холодно"));
writer.commit();
writer.close();
//поиск
int startFrom = 0;
int pageSize = 20;
DirectoryReader ireader = DirectoryReader.open(directory);
IndexSearcher indexSearcher = new IndexSearcher(ireader);
//FuzzyQuery осуществляет поиск неточных вхождений
FuzzyQuery wildcardQuery = new FuzzyQuery(new Term(fieldName, "мама"));
TopDocs topDocs = indexSearcher.search(wildcardQuery, startFrom + pageSize);
ScoreDoc[] hits = topDocs.scoreDocs;
for (int i = startFrom; i < topDocs.totalHits; i++) {
if (i > (startFrom + pageSize) - 1) {
break;
}
Document hitDoc = indexSearcher.doc(hits[i].doc);
if (hitDoc != null) {
System.out.println(hitDoc.get(fieldName));
}
}
}