gpt4 book ai didi

hibernate - 无法让 @OneToMany 与 hibernate 一起使用

转载 作者:行者123 更新时间:2023-12-02 22:32:04 24 4
gpt4 key购买 nike

我是 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(名称=“customer_session”)公共(public)类 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 相同 - 仍然没有效果。

我只是希望它能够工作 - 无论表格最终看起来如何。但如果有一个 hibernate 专家在那里 - 我希望在 customerSssion 中有一个外键,将 customerLogin 指向作为外键关系。但是,就像我说的,我现在已经在这个问题上摆弄了近两天了——如果它能起作用,我会非常高兴。预先感谢您的努力和时间。

最佳答案

注意:我远不是专家,只是你的映射对我来说有点倒退。

您根本不应该在 @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?

关于hibernate - 无法让 @OneToMany 与 hibernate 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com