wtorek, 23 marca 2010

Duplicate entry '0' for key 'PRIMARY'

Błąd jest spowodowany tym, że Liferay nie inkrementował klucza głównego. W pliku http://www.liferay.com/dtd/liferay-service-builder_5_2_0.dtd jest podanych kilka przykładów jak można uzyskać automatyczną inkrementację klucza, jednak każdy z nich ma jakieś ograniczenia lub ograniczone zastosowania. Tutaj podam przykład jak można to zrobić w inny sposób.

Podpatrując źródła Liferay'a, np. klasę GroupLocalServiceImpl.java znalazłem coś takiego:


String groupId = Long.toString(CounterLocalServiceUtil.increment(Group.class.getName()));

Tak więc, wystarczy zrobić coś takiego:

Entity e = EntityLocalServiceUtil.createEntity(CounterLocalServiceUtil.increment(Entity.class.getName()));
e.setContent("foobar");

EntityLocalServiceUtil.addEntity(e);

czwartek, 4 marca 2010

Liferay Service Builder

Moje pierwsze podejście zaczęło się od przerobienia prostego tutoriala. Wszystko poszło bez problemu. Kolejne podejście polegało na wykorzystaniu jakiegoś narzędzia, aby usprawnić sobie pracę. Ciekawym rozwiązaniem jest PortalPack. Dzięki niemu można szybko wygenerować masę kodu, zamiast cały dzień wklepywać coś w XML'a. Dobrym przykład znajduje się tutaj. Aby móc z niego korzystać należy po zainstalowaniu plugin'u we właściwościach projektu zdefiniować na jakim serwerze projekt będzie działał, w tym przypadku Liferay Portal Server 5.1.x/5.2.x. Tak więc:

Properties>Run>Server>Liferay Portal Server 5.1.x/5.2.x.

Jeżeli nie ma tam takiej opcji, to należy dodać przez menu:

Tools>Server>Add Server

Możliwe, że wchodzę za bardzo w szczegóły, ale jest może się kiedyś komuś przyda.

Osobiście Service Builder'a z Portal Pack używam jedynie do generowania pliku service.xml. Całą resztę robię za pomocą Ant'a i liferay-plugins-sdk-5.2.3. Jeśli kogoś interesuje co można wpisać w service.xml to niech sobie przejrzy http://www.liferay.com/dtd/liferay-service-builder_5_2_0.dtd.

Gdy wygenerujemy serwisy, to w "magiczny sposób" możemy dobrać się do bazy danych. Czasem może się zdarzyć coś takiego:

com.liferay.portal.kernel.dao.orm.ORMException: Could not execute JDBC batch update

Spowodowane przez:

Data truncation: Data too long for column 'content' at row 1

W tym momencie dotrze do Ciebie myśl kołatająca się gdzieś z tyłu głowy, że czegoś tutaj brakuje. Mianowicie "magiczny sposób" widząc String "myśli" VARCHAR(75) ;-)

Rozwiązaniem okazuje się stworzenie pliku z podpowiedziami w miejscu gdzie masz źródła w META-INF/portlet-model-hints.xml. W tym przypadku wystarczy dodać:

<field name="content" type="String">
    <hint-collection name="CLOB" />
</field>



Więcej przykładów znajdziesz w portal-impl.jar/META-INF/portal-model-hints.xml