使用无状态会话保存ManyToMany集合

Ste*_*nko 4 java hibernate hql

我有:

@Entity
public class EmailAndName {
...
}
Run Code Online (Sandbox Code Playgroud)

@Entity
public class MessageDetails {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "MessageDetails_to")
    public Set<EmailAndName> getTo() {
        return to;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我

public static void main(String []a)
{
    StatelessSession sess = HibernateUtils.getSessionFactory().openStatelessSession();
    sess.beginTransaction();
    MessageDetails messageDetails = new MessageDetails();
    messageDetails.setTo(new HashSet<EmailAndName>());
    EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
    if (emailAndName == null ) throw new RuntimeException();
    messageDetails.getTo().add(emailAndName);
    sess.insert(messageDetails);
    sess.getTransaction().commit();
}
Run Code Online (Sandbox Code Playgroud)

MessageDetails_to表未填充.我该怎么办?我不想写本机查询.谢谢.

Dar*_*rse 5

你还没有通过hibernate-doc阅读无状态会话

它明确指出:

Operations performed using a stateless session never cascade to associated instances. Collections are ignored by a stateless session.
Run Code Online (Sandbox Code Playgroud)

而你正试图添加一个Set<EmailAndName>.无状态会话是较低级别的抽象,更接近底层JDBC.所以,如果你真的想让你的代码工作并填充MessageDetails_to ..你需要去Session.你需要为你的POJO定义equals和hashCode方法:)

所以你修改后的代码将是:

public static void main(String []a)
{
   try{
    Session sess = HibernateUtils.getSessionFactory().openSession();
    sess.beginTransaction();
    MessageDetails messageDetails = new MessageDetails();
    messageDetails.setTo(new HashSet<EmailAndName>());
    EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
    if (emailAndName == null ) throw new RuntimeException();
    messageDetails.getTo().add(emailAndName);
    sess.save(messageDetails);
    sess.getTransaction().commit();
 }
catch(HibernateException e)
 {
   sess.getTransaction.rollback();
   e.printStackTrace();
 }
  finally{
       sess.close();
  }
Run Code Online (Sandbox Code Playgroud)

你必须总是有一个try catch,这样你就可以识别异常(如果有的话)并让它工作:)