Java Hibernate-自动持久化每个关系
也许这是一个简单的问题,但我在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
@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>