Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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 Hibernate-自动持久化每个关系_Java_Hibernate - Fatal编程技术网

Java Hibernate-自动持久化每个关系

Java Hibernate-自动持久化每个关系,java,hibernate,Java,Hibernate,也许这是一个简单的问题,但我在Hibernate中找不到这种关系 我有以下实体: @Entity public class User { ... @OneToMany(mappedBy = "user") private Set<Conversation> posts = new HashSet<Conversation>(); ... } @Entity public class Conversation { ... @OneToMany(m

也许这是一个简单的问题,但我在Hibernate中找不到这种关系

我有以下实体:

@Entity
public class User {
  ...
  @OneToMany(mappedBy = "user")
  private Set<Conversation> posts = new HashSet<Conversation>();
  ...
}

@Entity
public class Conversation { 
  ...
  @OneToMany(mappedBy = "conversation")
  private Set<Message> messages = new HashSet<Message>();
  ...
}

@Entity
public class Message { ... }
但只有用户保存在数据库中——为什么不是全部?因为默认的延迟抓取?我的想法能以某种方式实现吗

PS:当然,我知道持久化每个实体的解决方案,但我习惯于在其他框架(如nette或Django)中这样做,所以我无法忘怀

PPS:我发现问题在于默认的级联类型。是否可以全局设置,例如在Hibernate配置XML中?这是一个好主意吗(从性能的角度来看——每次都在“超级持久化”上持久化,或者仅在发生更改时才持久化)

购买力平价:我还发现(与Django相反),我必须为添加到集合中的每个项目设置FK EXPOST。这是自然的(因为选择了纯集合类型),但对我来说是新的。你会推荐我哪种方法?项实体上构造函数中所需的FK作为参数,例如:

  Class Message{
    Message(Conversation conversation){
       setConversation(conversation);
    }
    ...
  }
或在FK设置的位置添加方法,例如:

  Class Conversation{
    ...
    public void addMessage(Message msg){
       msg.setConversation(this);
       getMessages().add(msg);
    }
    ...
  }
?

创建会话+配置XML

private final static String CFG = "hibernate-cfg.xml";
    private final static String SCRIPT_FILE = "query.sql";

    private static SessionFactory sessionFactory;

    private static ServiceRegistry buildRegistry() {
        return new StandardServiceRegistryBuilder()
                .configure(CFG)
                .build();
    }

    private static Metadata getMetaData() {
        return new MetadataSources(buildRegistry()).getMetadataBuilder().build();
    }

    private static SessionFactory buildSessionFactory() {
        return getMetaData().getSessionFactoryBuilder().build();
    }

    public static SessionFactory getSessionFactory() {
        if (sessionFactory == null) {
            sessionFactory = buildSessionFactory();
        }
        return sessionFactory;
    }

    public static Session getSession(){
        try {
            return getSessionFactory().openSession();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
以及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="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
    <property name="connection.url">
            jdbc:mysql://localhost:3306/learnme
        </property>
    <property name="connection.username">root</property>
    <property name="connection.password"/>
    <property name="connection.pool_size">100</property>
    <!-- SQL dialect -->
    <property name="hibernate.dialect">
            org.hibernate.dialect.MySQL5Dialect
        </property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache -->
    <property name="cache.provider_class">
            org.hibernate.cache.NoCacheProvider
        </property>
    <!-- Display all generated SQL to stdout -->
    <property name="show_sql">true</property>
    <!-- Drop and re-create the database schema on startup -->
    <property name="hbm2ddl.auto">update</property>
    <mapping class="learnme.hibernate.entities.User"/>
    <mapping class="learnme.hibernate.entities.Conversation"/> 
    <mapping class="learnme.hibernate.entities.Message"/>
  </session-factory>
</hibernate-configuration>

com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/learnme
根
100
org.hibernate.dialogue.mysql5dialogue
线
org.hibernate.cache.NoCacheProvider
真的
更新
根据和 您需要在
persistence.xml
文件中包含此项,以便全局设置它:

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
   <persistence-unit-metadata>
     <persistence-unit-defaults>
       <cascade-persist/>
     </persistence-unit-defaults>
   </persistence-unit-metadata>
</entity-mappings>

映射文件必须位于默认位置, META-INF/orm.xml,或在另一个明确指定的位置 在持久性单元定义中(在persistence.xml中)


对不起,我不明白。这个片段应该放在哪里?在persistence.xml或orm.xml中-但它们与JPA和EntityManager相关,不是吗?我正在使用Hibernate config+SessionFactory,是否可以以某种方式集成它?我不完全理解您的要求。您是否尝试遵循链接并实现建议的方法?我添加了会话生成器代码。问题是,我使用的不是JPA persistence.xml,而是hibernate-cfg.xml,这是不同的。那么,如何将您的建议集成到附加的链接中呢?我不确定,但您是否尝试将persistence.xml与hibernate-cfg.xml一起添加?此外,您还可以尝试添加类似persistI的内容。我尝试了两种方法,但都没有效果。最后,我在persistence.xml->中解决了orm.xml上的引用问题,它必须位于特定的META-INF文件夹中,而不是Netbeans创建的默认文件夹
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
   <persistence-unit-metadata>
     <persistence-unit-defaults>
       <cascade-persist/>
     </persistence-unit-defaults>
   </persistence-unit-metadata>
</entity-mappings>