无法让@OneToMany使用hibernate

时间:2013-04-11 09:29:40

标签: hibernate one-to-many many-to-one

我是hibernate的新手,但不是Java或数据库。我尝试建立一个@OneToMany关系,但不知怎的,我可以让它工作。我现在尝试了两天,我搜索了很多,但我仍然得到例外 为了了解hibernate,我尝试创建一个小服务器,它将消息发送回客户端。这很好用 - 使用hibernate从数据库中读取也可以正常工作。现在我的想法是,当用户进入系统时,会创建一个sessionid并将其与时间戳一起存储在数据库中......然后就会出现问题。
我会发布我的代码,所以你会理解。

@Entity
@NamedQuery(name="CustomerLogin.getPassByEmail", query="from CustomerLogin where email = ?")
@Table(name="customer_login")
public class CustomerLogin {

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private BigInteger id;
private String email;
private String pass;
@OneToMany
//@JoinTable(name="customerlogin_sessions", joinColumns=@JoinColumn(name="user_id"))
private Collection<CustomerSession> sessions = new ArrayList<>();

我不会发布getter和setter。我想你会很感激;)你看我删除了@JoinTable - 因为它不起作用。 ......现在是CustomerSession类:

@Entity

@Table(name =“customer_session”) 公共类CustomerSession {

@Id @GeneratedValue(strategy= GenerationType.AUTO)
private BigInteger id;
@ManyToOne 
private CustomerLogin customerLogin;
private BigInteger userid;
private int sessionid;
@Temporal(TemporalType.TIMESTAMP)
private Date logintime;

这里应该发生魔术:

        Session session = sessionFactory.openSession();
    session.beginTransaction();

    Query query = session.getNamedQuery("CustomerLogin.getPassByEmail");
    query.setString(0, commands.get("email"));
    List<CustomerLogin> passes = (List<CustomerLogin>)query.list();


    if(evaluateLoginData(passes)){ //consider it true
        CustomerLogin customer = passes.get(0);
        int sessionId = createSessionId();

        CustomerSession customerSession = new CustomerSession();
        customerSession.setLogintime(new Date());
        customerSession.setCustomerLogin(customer);
        customerSession.setSessionid(sessionId);

        customer.getSessions().add(customerSession);

        session.save(customerSession);
        session.save(customer);


        returnMessage =  "LOGINACC id:"+customer.getId() + ";session:"+Integer.toString(sessionId);
    }else{
        returnMessage = "LOGINDENIED message:LOGINDENIED";
    }

    session.getTransaction().commit();
    session.close();

我还将发布hibernate.cfg.xml - 可能存在问题。

<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </property>
<property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver </property>
<property name="hibernate.connection.url"> jdbc:mysql://localhost/server </property>

<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>

<property name="show_sql">true</property>
<property name="hibernate.connection.pool_size">5 </property>
<property name="hdm2ddl.auto">update</property>

<mapping class="balancer.dbpojos.CustomerLogin"/> 
<mapping class="balancer.dbpojos.CustomerSession"/> 

   

据我了解,当我只使用@OneToMany和@ManyToOne时,hibernate应该创建一个关系的新表。然而它说,找不到表customerlogin_customersession - 即使我更改了hdm2ddl.auto来创建。我尝试了myppedBy属性和targetEntity,与@ JoinTableJ,JoinColumns和@InverseJoinColumns相同 - 仍然没有效果。

我只是想让它起作用 - 不管表格到底是怎么样的。但是如果那里有一个休眠大师 - 我希望在customerSssion中有一个外键,指向customerLogin作为外键关系。但是,就像我说的那样,我现在正在解决这个问题近两天 - 如果它只能起作用,我会非常高兴。 提前感谢您的努力和时间。

1 个答案:

答案 0 :(得分:3)

注意:我离专家很远,看起来你的映射对我来说有些落后。

你根本不应该在@OneToMany方面拥有@JoinColumn。

这样的事情应该更接近:

@OneToMany(mappedBy="id")
private Collection<CustomerSession> sessions = new ArrayList<>();

@JoinColumn(name = "ID", referencedColumnName = "ID")
@ManyToOne 
private CustomerLogin customerLogin;

进一步阅读: Can someone please explain mappedBy in hibernate?