Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用无状态会话保存多个集合_Java_Hibernate_Hql - Fatal编程技术网

Java 使用无状态会话保存多个集合

Java 使用无状态会话保存多个集合,java,hibernate,hql,Java,Hibernate,Hql,我有: 及 @实体 公共类消息详细信息{ @ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL) @JoinTable(name=“MessageDetails\u to”) 公共集getTo(){ 返回; } } 当我 @Entity public class MessageDetails { @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)

我有:

@实体
公共类消息详细信息{
@ManyToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
@JoinTable(name=“MessageDetails\u to”)
公共集getTo(){
返回;
}
}
当我

@Entity
public class MessageDetails {
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "MessageDetails_to")
    public Set<EmailAndName> getTo() {
        return to;
    }
}
publicstaticvoidmain(字符串[]a)
{
无状态会话sess=HibernateUtils.getSessionFactory().openStatesession();
sess.beginTransaction();
MessageDetails MessageDetails=新建MessageDetails();
setTo(新的HashSet());
EmailAndName EmailAndName=(EmailAndName)sess.get(EmailAndName.class,1L);
如果(emailAndName==null)抛出新的RuntimeException();
messageDetails.getTo().add(emailAndName);
插入(消息详细信息);
sess.getTransaction().commit();
}

未填充表的MessageDetails_。我该怎么办?我不想编写本机查询。谢谢。

首先,您确定交易已完成吗

其次,您正在使用一个
集合
。您确定
EmailAndName
类的
equals
hashCode
方法定义良好吗?

您尚未通读无状态会话的相关内容

它明确指出:

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();
}
您正在尝试添加一个
。无状态会话是较低级别的抽象,更接近底层JDBC。因此,如果您真的想让代码正常工作并将MessageDetails_填充到。。你需要去参加会议。您需要为POJO定义equals和hashCode方法:)

因此,您修改的代码将是:

Operations performed using a stateless session never cascade to associated instances. Collections are ignored by a stateless session.
publicstaticvoidmain(字符串[]a)
{
试一试{
Session sess=HibernateUtils.getSessionFactory().openSession();
sess.beginTransaction();
MessageDetails MessageDetails=新建MessageDetails();
setTo(新的HashSet());
EmailAndName EmailAndName=(EmailAndName)sess.get(EmailAndName.class,1L);
如果(emailAndName==null)抛出新的RuntimeException();
messageDetails.getTo().add(emailAndName);
sess.save(messageDetails);
sess.getTransaction().commit();
}
捕获(休眠异常e)
{
sess.getTransaction.rollback();
e、 printStackTrace();
}
最后{
sess.close();
}

您必须始终附带一个try-catch,以便能够识别异常(如果有)让它工作:)

好吧,我认为代码不工作的主要原因是使用了无状态会话,但在任何情况下,我建议您在实现1-N和N-M关系时定义关系的反面,并更新双方

此外,不要让外部类直接操作集合,因为它会破坏封装。不要为集合公开集合方法,这可能会导致难以调试的异常。请使用add和remove方法更新集合

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();
  }

我提交。我使用无状态会话,这就是为什么不需要实现hash和equals的原因。您使用的会话类型与您的模型对象是否需要equals和hashCode有什么关系?Set确实需要equals和hashCode方法。没有它们,它将永远无法工作。请看一下.St的最后一个答案无法附加无卫星会话。这就是为什么不需要equals和hashcode。尽管我已经实现了它们,但联接表仍然为空。会话是无状态的这一事实与需要定义
equals
hashcode
方法无关。您必须定义它们,因为您正在添加它们到
集合
。如果您使用
列表
而不是
集合
,那么您真的不需要它们。
集合
旨在禁止重复项,它使用
equals
方法来确定元素是否已经存在。如果您不实现
equals
方法,则
集合
无法检查重复项,也无法工作。您能提供详细的表结构吗?我知道您说过不想编写本机查询,但我发现在无状态会话中填充多对多关联表的唯一方法(从而受益于无状态会话的速度)。即
sess.CreateSQLQuery(“将(…)值(:id1,id2)插入MessageDetails_中。设置参数…等。
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();
  }
@Entity
public class MessageDetails {

    private Set<EmailAndName> to = new HashSet<EmailAndName>();

    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinTable(name = "MessageDetails_to", 
       joinColumns = {@JoinColumn(name = "MESSAGE_DETAILS_ID"},
       inverseJoinColumns = {@JoinColumn(name = "EMAIL_AND_ADDRESS_ID")})
    public Set<EmailAndName> getTo() {
        return Collections.unmodifiableSet(to);
    }

    public void addEmaiAndName(EmailAndName emailAndName) {
       emailAndName.setMessageDetails(this);
       to.add(emailAndName);
    }

    public void removeEmailAndName(EmailAndName emailAndName) {
       emailAndName.setMessageDetails(null);
       to.remove(emailAndName);
    }

}
Session sess = HibernateUtils.getSessionFactory().openSession();
sess.beginTransaction();
MessageDetails messageDetails = new MessageDetails();
EmailAndName emailAndName = (EmailAndName) sess.get(EmailAndName.class, 1L);
if (emailAndName == null ) throw new RuntimeException();
messageDetails.addEmailAndName(emailAndName);
sess.save(messageDetails);
sess.getTransaction().commit();