Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate и MySql


Автор: fisherman 6.3.2008, 20:55
Помогите пожалуйста!!!
Не могу разобраться в чем ошибка?

В базе данных есть 2 сущности: пользователь и корабли.
Пользователь:
id
login
password
Корабли:
id
name
typename
manufacturer
owner_id

hibernate.cfg.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.password">fisherhunter</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost/shop</property>
        <property name="hibernate.connection.username">fisher</property>
        <property name="show_sql">true</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <mapping resource="starship.hbm.xml"/>
        <mapping resource="user.hbm.xml"/>
    </session-factory>
</hibernate-configuration>


starship.hbm.xml
Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="Starship" table="starship">
  <id name="id" column="id" type="java.lang.Integer">
  <generator class="increment"></generator>
  </id>
  <property name="name" type="java.lang.String"></property>
  <property name="typeName" type="java.lang.String"></property>
  <property name="manufacturer" type="java.lang.String"></property>
  <property name="owner_id" type="java.lang.Integer"></property>
  
  </class>
</hibernate-mapping>


user.hbm.xml
Код

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

  <class name="User" table="user">
  
  <id name="id" column="id" type="java.lang.Integer">
  <generator class="native"></generator>
  </id>
  
  <property name="login" type="java.lang.String"></property>
  <property name="password" type="java.lang.String"></property>
  
  <set name="relations" table="starship" cascade="all">
  <key column="owner_id"></key>
  <one-to-many class="User"/>
  </set>
  
  </class>
</hibernate-mapping>


test.java
Код

import net.sf.hibernate.*;
import net.sf.hibernate.cfg.Configuration;
public class Test {
    
    public static void main(String[] args) throws Exception {

        User p = new User();
        p.setId(4);
        p.setLogin("artur");
        p.setPassword("qwe");

        Configuration cfg = new Configuration().addClass(User.class);
        SessionFactory sf = cfg.buildSessionFactory();

        Session sess = sf.openSession();

        Transaction t = sess.beginTransaction();
        sess.save(p);
        t.commit();
        sess.close();
        }
    }


При компиляции выводит:

Цитата

Activation.main: warning: sun.rmi.activation.execPolicy system
property unspecified and no ExecPermissions/ExecOptionPermissions
granted; subsequent activation attempts may fail due to unsuccessful
ExecPermission/ExecOptionPermission permission checks.  For
documentation on how to configure rmid security, refer to:

http://java.sun.com/j2se/1.4/docs/tooldocs/solaris/rmid.html
http://java.sun.com/j2se/1.4/docs/tooldocs/win32/rmid.html

Activation.main: an exception occurred: Port already in use: 1098; nested exception is: 
    java.net.BindException: Address already in use: JVM_Bind
java.rmi.server.ExportException: Port already in use: 1098; nested exception is: 
    java.net.BindException: Address already in use: JVM_Bind
    at sun.rmi.transport.tcp.TCPTransport.listen(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.exportObject(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.exportObject(Unknown Source)
    at sun.rmi.transport.LiveRef.exportObject(Unknown Source)
    at sun.rmi.server.UnicastServerRef.exportObject(Unknown Source)
    at sun.rmi.registry.RegistryImpl.setup(Unknown Source)
    at sun.rmi.registry.RegistryImpl.<init>(Unknown Source)
    at java.rmi.registry.LocateRegistry.createRegistry(Unknown Source)
    at sun.rmi.server.Activation.main(Unknown Source)
Caused by: java.net.BindException: Address already in use: JVM_Bind
    at java.net.PlainSocketImpl.socketBind(Native Method)
    at java.net.PlainSocketImpl.bind(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createServerSocket(Unknown Source)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createServerSocket(Unknown Source)
    at sun.rmi.transport.tcp.TCPEndpoint.newServerSocket(Unknown Source)
    ... 9 more


В чем ошибка?

Автор: force 6.3.2008, 21:06
Во-первых, во время компиляции такого быть не может. Это уже во время запуска вылетает exception.
Судя по исключению, порт просто банально занят каким-то другим приложением. Можно просто в настройках сервера вместо 1098 попробовать другой порт прописать.

Автор: fisherman 6.3.2008, 21:15
Но у меня вроде порта 1098 в настройках ни где и нет???

Добавлено через 1 минуту и 43 секунды
И я что-то не могу понять почему Exception rmi???

Автор: greef 7.3.2008, 00:55
http://forum.java.sun.com/thread.jspa?threadID=5044757
http://www.artima.com/forums/flat.jsp?forum=16&thread=2663

А вообще, в решении таких проблем лучший помощник - google

Автор: anglerhood 8.3.2008, 03:05
Если работаешь в win 
1) набери в консоли 
Код

netstat -ab > who_took_my_port_wtf.txt
 
2) открой файлик who_took_my_port_wtf.txt и найди приложение, которое использует порт 1098
3) закрой это приложение.

Если ты работаешь в *nix, то и сам разберёшься.

Автор: fisherman 8.3.2008, 22:29
Я посмотрел, у меня порт 1098 занят javaw.exe
Как я понял это виртуальная машина...???
Что делать не знаю...
Подскажите пожалуйста!!!

Автор: fisherman 8.3.2008, 22:55
С портом вроде разобрался, но при запуске все равно выскакивает:
Код

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
    at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:57)
    at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39)
    at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:426)
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:128)
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2073)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1298)
    at Test.main(Test.java:14)

Помогите пожалуйста!

Автор: check 9.3.2008, 01:23
Цитата(fisherman @  6.3.2008,  20:55 Найти цитируемый пост)
Configuration cfg = new Configuration().addClass(User.class);
А если эту строку заменить на 
Код

Configuration cfg = new Configuration().configure("hibernate.cfg.xml");



Автор: fisherman 9.3.2008, 11:44
Заменил на:
Код

Configuration cfg = new Configuration().configure("hibernate.cfg.xml");

Сейчас выскакивает:
Код

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find a getter for relations in class User
    at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)
    at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)
    at org.hibernate.mapping.Property.getGetter(Property.java:272)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:247)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:125)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
    at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
    at Test.main(Test.java:15)

??????

Автор: Kangaroo 9.3.2008, 12:08
Цитата(fisherman @  9.3.2008,  10:44 Найти цитируемый пост)
Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find a getter for relations in class User

Вывод: в классе User добавь геттер/сеттеры для поля relations.

Автор: fisherman 9.3.2008, 12:25
Но get b set у меня есть:
User.java
Код

import java.util.Set;
public class User {
    private Integer id;
    private String login;
    private String password;
    private Set starship;
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id=id;
    }
    
    public String getLogin() {
        return login;
    }
    
    public void setLogin(String login) {
        this.login=login;
    }
    
    public String getPassword() {
        return password;
    }
    
    public void setPassword(String password) {
        this.password=password;
    }
    
    public Set getStarship() {
        return starship;
    }
    
    public void setStarship(Set starship) {
        this.starship=starship;
    }

}

Starship.java
Код

public class Starship {
    private Integer id;
    private String name;
    private String typeName;
    private String manufacturer;
    private Integer owner_id;
    
    public Integer getId() {
        return id;
    }
    
    public void setId(Integer id) {
        this.id=id;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name=name;
    }
    
    public String getTypeName() {
        return typeName;
    }
    
    public void setTypeName(String typeName) {
        this.typeName=typeName;
    }
    
    public String getManufacturer() {
        return manufacturer;
    }
    
    public void setManufacturer(String manufacturer) {
        this.manufacturer=manufacturer;
    }
    
    public Integer getOwner_Id() {
        return owner_id;
    }
    
    public void setOwner_Id(Integer owner_id) {
        this.owner_id=owner_id;
    }

}


Автор: Kangaroo 9.3.2008, 12:44
fisherman, в маппинге ты задал имя relations, его и нужно использовать в классе, а не starship

Автор: check 9.3.2008, 12:56
И one-to-many класс будет Starship, а не User, как я понял
Код

  <set name="relations" table="starship" cascade="all">
  <key column="owner_id"/>
  <one-to-many class="Starship"/>
  </set>

Автор: fisherman 9.3.2008, 19:36
Удалил 
Код

<set name="relations" table="starship" cascade="all">
  <key column="owner_id"/>
  <one-to-many class="User"/>
  </set>

из User.hbm.xml

а Starship.hbm.xml дописал:
Код

<many-to-one name="owner_id" column="owner_id" class="User"></many-to-one>


Уже выскакивает:
Код

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Exception in thread "main" org.hibernate.PropertyNotFoundException: Could not find a getter for owner_id in class Starship
    at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:282)
    at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:275)
    at org.hibernate.mapping.Property.getGetter(Property.java:272)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:247)
    at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:125)
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
    at org.hibernate.tuple.entity.EntityEntityModeToTuplizerMapping.<init>(EntityEntityModeToTuplizerMapping.java:56)
    at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:302)
    at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:434)
    at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:109)
    at org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:226)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
    at Test.main(Test.java:13)


Как я понял ругается, будто нет геттера для owner_id в классе Starship, хотя он там прописан...
????????????

Автор: Kangaroo 9.3.2008, 20:04
У тебя:
Код

public Integer getOwner_Id() {
        return owner_id;
    }
    
    public void setOwner_Id(Integer owner_id) {
        this.owner_id=owner_id;
    }


Нужно:
Код

public Integer getOwner_id() {
        return owner_id;
    }
    
    public void setOwner_id(Integer owner_id) {
        this.owner_id=owner_id;
    }


Если ты юзаешь IDE, то там должна быть функция авто генерирования геттеров/сеттеров

Автор: fisherman 9.3.2008, 20:16
Спасибо, все получилось!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)