一对多自关联
描述:二级菜单对应的子节点父节点
- 创建持久化类
public class TreeNode {
/**
* -- 一对多双向自关联
-- 菜单表
-- t_hibernate_sys_tree_node
-- t:表
-- sys:模块名缩写(system)
-- tree_noe:表名
create table t_hibernate_sys_tree_node
(
tree_node_id int primary key auto_increment, -- ID
tree_node_name varchar(50) not null, -- 名字
tree_node_type int not null check(tree_node_type = 1 or tree_node_type = 2), -- 节点类型:1 枝节点 2 叶节点
position int, -- 位置
parent_node_id int, -- 父节点ID
url varchar(1024), -- URL
foreign key(parent_node_id) references t_hibernate_sys_tree_node(tree_node_id)
);
*/
private Integer tree_node_id;
private String tree_node_name;
private Integer tree_node_type;
private Integer position;
private String url;
private TreeNode parent;
private Set<TreeNode> children = new HashSet<>();
public TreeNode() {
}
public Integer getTree_node_id() {
return tree_node_id;
}
public void setTree_node_id(Integer tree_node_id) {
this.tree_node_id = tree_node_id;
}
public String getTree_node_name() {
return tree_node_name;
}
public void setTree_node_name(String tree_node_name) {
this.tree_node_name = tree_node_name;
}
public Integer getTree_node_type() {
return tree_node_type;
}
public void setTree_node_type(Integer tree_node_type) {
this.tree_node_type = tree_node_type;
}
public Integer getPosition() {
return position;
}
public void setPosition(Integer position) {
this.position = position;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public Set<TreeNode> getChildren() {
return children;
}
public void setChildren(Set<TreeNode> children) {
this.children = children;
}
@Override
public String toString() {
return "TreeNode [tree_node_id=" + tree_node_id + ", tree_node_name=" + tree_node_name + ", tree_node_type="
+ tree_node_type + ", position=" + position + ", url=" + url + ", parent=" + parent + ", children="
+ children + "]";
}
}
- 创建持久化配置文件
<hibernate-mapping>
<class name="com.zking.five.hibernate.TreeNode" table="t_hibernate_sys_tree_node">
<id name="tree_node_id" type="java.lang.Integer">
<column name="tree_node_id" />
<generator class="assigned" />
</id>
<property name="tree_node_name" type="java.lang.String">
<column name="tree_node_name" />
</property>
<property name="tree_node_type" type="java.lang.Integer">
<column name="tree_node_type" />
</property>
<property name="position" type="java.lang.Integer">
<column name="position" />
</property>
<property name="url" type="java.lang.String">
<column name="url" />
</property>
<!--当前节点与父节点的关系 -->
<many-to-one name="parent" class="com.zking.five.hibernate.TreeNode">
<column name="parent_node_id" />
</many-to-one>
<!--当前节点与字节点的关系 -->
<set name="children">
<key>
<column name="parent_node_id" />
</key>
<one-to-many class="com.zking.five.hibernate.TreeNode" />
</set>
</class>
</hibernate-mapping>
- 创建配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/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/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">1920</property>
<!-- 属性方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 本地事务(jdbc)getCurrentSession -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- 全局事务 (jta)-->
<!-- <property name="hibernate.current_session_context_class">jta</property> -->
<!-- 引入实体类的映射文件 -->
<!-- 一对多自向关联 -->
<mapping resource="com/zking/five/hibernate/TreeNode.hbm.xml"/>
</session-factory>
</hibernate-configuration>
-4 junit测试
public class TestTreeNode {
private SessionFactory sessionFactory;
private Session session;
private Transaction transaction;
private TreeNode s = null;
private TreeNodeDao dao = null;
@Before
public void setUp() throws Exception {
Configuration config = new Configuration().configure();
sessionFactory =config.buildSessionFactory();
session = sessionFactory.openSession();
transaction = session.beginTransaction();
dao = new TreeNodeDao();
}
@After
public void tearDown() throws Exception {
// //提交事务
transaction.commit();
//关闭会话
session.close();
//关闭会话工厂
sessionFactory.close();
}
@Test
public void testOpenSession() {
TreeNode treeNode = new TreeNode();
}
@Test
public void testGetStudent() {
TreeNode tree = new TreeNode();
tree.setTree_node_id(6);
TreeNode tn = this.dao.get(tree);
System.out.println(tn.getTree_node_id());
System.out.println(tn.getTree_node_name());
System.out.println(tn.getParent().getTree_node_name());
}
创建dao类
public class TreeNodeDao {
public TreeNode get(TreeNode treeNode) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction transaction = session.beginTransaction();
TreeNode node = session.get(treeNode.getClass(), treeNode.getTree_node_id());
// TreeNode node = session.load(treeNode.getClass(), treeNode.getTree_node_id());
// Hibernate.initialize(node.getParent());
// Hibernate.initialize(node.getChildren());
transaction.commit();
return node;
}
}
当你在进行junit测试的时候,当通过当前节点去查询父节点或者子节点的时候他返回的值只是一个代理对象,只有在dao层加入Hibernate.initialize(代理对象),才能拿到数据库返回的值
2. 生成控制台语句
Hibernate:
drop table if exists t_hibernate_sys_tree_node
十一月 25, 2018 8:11:55 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@17e0933c] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Hibernate:
create table t_hibernate_sys_tree_node (
tree_node_id integer not null,
tree_node_name varchar(255),
tree_node_type integer,
position integer,
url varchar(255),
parent_node_id integer,
primary key (tree_node_id)
) type=MyISAM
十一月 25, 2018 8:11:55 下午 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@47acd13b] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Hibernate:
alter table t_hibernate_sys_tree_node
add constraint FK3isolsrg9qcvutpyt472trlh1
foreign key (parent_node_id)
references t_hibernate_sys_tree_node (tree_node_id)