2009-12-23 3 views
7

Прямо сейчас у меня есть программа java, чьи классы в настоящее время являются POJO и хранятся в энергозависимой памяти. Они должны быть сохранены. Насколько я понимаю, два популярных варианта: JDO и Java Persistence API. Для тех, кто мало знает о SQL, Torque и т. Д., Что является самым простым способом добавить постоянство к данным моей программы?Какой самый простой способ сохранить объекты Java?

+3

Для всего, что является (un) святым, оставайтесь как можно дальше от Torque. – ChssPly76

ответ

7

Традиционный способ сериализации файловой системы - использовать Java Serialisation. Однако вам необходимо внедрить Serializable.

Простым решением является сериализация в формате XML (а затем сбрасывание в файловую систему) с использованием XStream. Вам не нужно реализовывать какие-либо интерфейсы, и большинство всего сериализуется и десериализуется без дальнейшего вмешательства. При необходимости вы можете настроить сериализацию. Единственная проблема, которую я когда-либо имел в serialising внутреннего класса, не намеренно serialising вмещающего внешний класса (это связанно с неявной this ссылки)

6

Сериализовать объекты в файловой системе, если вы не знаете SQL или реляционные базы данных.

Вам нужно научиться JDBC использовать JDO, JPA, Hibernate или что-то еще. Если ваши POJO не будут ужасно сложными, я бы посоветовал начать там и работать над вами.

Убедитесь, что вы узнали о нормализации и правильном оформлении индексов.

+0

Чтобы использовать JDO, JPA или Hibernate, вам явно не нужно знать JDBC, поскольку это точка этих API.Они используют JDBC под обложками, когда они сохраняются в РСУБД, так что сложность скрыта от вас. – DataNucleus

+3

Я не согласен - использовать их не рекомендуется, не зная JDBC. Сложность скрыта, но это непрозрачная абстракция. – duffymo

+1

Непроникающая абстракция с JDO, хотя, конечно, JPA и Hibernate сильно привязаны к JDBC. Зависит от того, какой API опрос решает пойти – DataNucleus

2

Похоже, что вы можете захотеть сохранить базу данных. Однако, чтобы избежать сложностей БД, одним простым решением для сохранения POJO в файловой системе является сериализация их в XML-документе. API Java 1.6 включает в себя инфраструктуру JAXB, найденную в пакете javax.xml.bind. Для того, чтобы использовать JAXB вы существенно аннотацию свой POJO и создавать МАРШАЛ и распаковать методы, как так:

@XmlRootElement(name="Foo") 
public class Foo { 

    @XmlElement(name="Bar") 
    public int mBar; 

    public static void marshal(Foo foo, OutputStream out) IOException {  
     try { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 
     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(qaConfig, out); 
     } 
     catch (JAXBException ex) { 
     throw new IOException(ex); 
     } 
     finally { 
     out.close(); 
     } 
    } 

    public static Foo unmarshal(InputStream in) throws IOException { 

     try { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 
     Unmarshaller unmarshaller = jc.createUnmarshaller(); 

     return (Foo)unmarshaller.unmarshal(in); 
     } 
     catch (JAXBException ex) { 
     throw new IOException(ex); 
     } 
     finally { 
     in.close(); 
     } 
    } 
} 

Допустим, вы упорствовать экземпляр Foo, где мБар 42, то это решение будет производить файл XML следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Foo> 
    <Bar>42</Bar> 
</Foo> 
+1

DataNucleus скрывает все эти маршаллинг и unmarshalling от пользователя, и они просто добавляют аннотации JDO или JPA к классам, которые они хотят сохранить. Меньше кода. Менее обрабатывать – DataNucleus

5

Самым простым способом я наткнулся на еще является db4o:

ObjectContainer db = Db4o.openFile(location); 
db.store(myObject); 
List<MyObject> myObjects = db.query(MyObject.class); 

Плюс есть отличные способы запроса другими способами.

+0

К сожалению: в октябре 2014 года Actian отказался продолжать активно продвигать коммерческое предложение продукта db4o для новых клиентов. http://supportservices.actian.com/versant/default.html – Jonathan

5

Если сериализация является опцией, рассмотрите возможность использования API распространенности, например prevalayer или Space4J (более поздняя версия). О распространенности объекта:

Преобладание является концепция начала Клаус Wuestefeld о том, как хранить данные в реальном объектно-ориентированном способом, используя снимки только памяти, журналы транзакций и сериализации.

Проверьте this article, чтобы узнать больше по этой теме (подробнее о Google).

+3

Space4j также предлагает прозрачный кластер и индексацию. – TraderJoeChicago

2

DataNucleus - это самый простой способ, поскольку он предоставляет API JDO и JPA для сохранения практически любого типа хранилища данных, который вам когда-либо понадобится. Зачем писать весь этот код JAXB в одном из других ответов, когда DataNucleus делает это за вас? Все подкреплено стандартами Java

Смежные вопросы