Eclipse快速上手EJB -- 5. 一对多的双向关系的CMR

顶刊《会计研究》数据复现|最新上市公司数智化数据 本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。 阅读详情

        这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 《 EJB - CMP/CMR 介绍》 改编而成的,这是一个系列,共有4篇文章。这篇文章综合了那4篇文章,看这篇文章前一定要参考一下,这样理解起来很方便,不过我做了部分修改,原理基本还是不变的。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse 中开发 CMP。    
  
   这篇文章主要讲述如何开发一对多的双向联系,这里设计了一个GroupBean,和UserInfoBean建立联系(注意,IBM 网站的文章是和UserBean建立联系,这里我认为和UserInfoBean建立联系更合适)。重点放在如何使用XDoclet建立一对多的双向联系,客户端的调用比较简单。
 
  
   关于环境配置、使用技巧还是要参考我以前的文章,这里尽量省略。
 
 
 
一、设计实体Bean :GroupBean
 
1. 建立主体部分:
 
●  在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :
· 包(K) :javamxj.ejb.cmp
· 名称(M): Group
· EJB Type: 选择 Container Managed Entity EJB
   点击下一步。
 
● Schema Name: GroupSchema
   Table Name: GroupTable
 
● 增加一个 name 栏:
· Field: name
· Field Type: java.lang.String
· Database Column: 名称
· SQL Type: varchar
  并且使它成为主键。 
 
● 同样,再增加一个 description 栏:
· Field: description
· Field Type: java.lang.String
· Database Column: 行业说明
· SQL Type: varchar
效果如下,最后点击完成。
 
注意:如上篇文章一样,将生成代码中的 sql-type="varchar" 改写成 sql-type="varchar(xy)" ,xy是一个合适的VARCHAR 的位数。
 
2. 完成 ejbCreate 和 ejbPostCreate 方法:
 
3. 在类标记中加入以下标记:
 
 
4. 增加一个Select method ,你可以使用JBoss-IDE得到,这里是代码(后面有完整的源代码):
 //########################   Select method     ##############################
/**
* Select method
* @ejb.select
*    query = "SELECT user.email  FROM GroupSchema AS g, IN (g.users) AS user  WHERE g.name = ?1"
*             
*/
public abstract java.util.Collection ejbSelectUserIDs(String groupName)
    throws javax.ejb.FinderException;

 /**
* Home method
* @throws FinderException
* @ejb.home-method  view-type = "local"
*/
public java.util.ArrayList ejbHomeGetUserIDs(String groupName)
      throws javax.ejb.FinderException {
    return (java.util.ArrayList) ejbSelectUserIDs(groupName);
}

 
5. 将 GroupBean 加入到 cmpEJB 模块中,然后 lomboz ->Generate EJB Classes
 
 
6. 重点:建立 GroupBean 与 UserInfoBean 的一对多的双向联系:
 
● 右击 GroupBean ->J2EE ->Add CMR Relationship :
  生成的代码参考下面给出的完整的源代码。
 
● 切换到 UserInfoBean.java: 
右击 UserInfoBean ->J2EE ->Add CMR Relationship :
 在 UserInfoBean.java 中生成的代码(需要手工添加 @jboss.relation):
/**
* Getter for CMR Relationship
*
* @ejb.interface-method   view-type="local"
* @ejb.relation           name = "GroupsHaveUserInfos"
*                         role-name = "UserInfosInGroup"
*                         target-multiple = "yes"
* @jboss.relation
*    fk-column = "组别"
*    related-pk-field = "name"
*/
public abstract javamxj.ejb.cmp.GroupLocal getGroup();

/**
* Setter for CMR Relationship
*
* @ejb.interface-method   view-type="local"
*/
public abstract void setGroup(javamxj.ejb.cmp.GroupLocal value);
 

Ok,再次 Generate EJB Classes ,如果一切正常,再进行下一步。
 
 
● 下面给出了GroupBean.java的完整的源代码:

GroupBean.java

/*
 * 创建日期 2005-1-26
 *
 * 作者:javamxj(分享java快乐)
 */
package javamxj.ejb.cmp;
/**
 *
 * <!-- begin-user-doc --> You can insert your documentation for '<em><b>GroupBean</b></em>'. <!-- end-user-doc --> *
 <!--  begin-lomboz-definition -->
 <?xml version="1.0" encoding="UTF-8"?>
 <lomboz:EJB xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:lomboz="http://lomboz.objectlearn.com/xml/lomboz">
 <lomboz:entity>
 <lomboz:entityEjb>
 <j2ee:display-name>Group</j2ee:display-name>
 <j2ee:ejb-name>Group</j2ee:ejb-name>
 <j2ee:ejb-class>javamxj.ejb.cmp.GroupBean</j2ee:ejb-class>
 <j2ee:persistence-type>Container</j2ee:persistence-type>
 <j2ee:prim-key-class>java.lang.String</j2ee:prim-key-class>
 <j2ee:cmp-version>2.x</j2ee:cmp-version>
 <j2ee:abstract-schema-name>GroupSchema</j2ee:abstract-schema-name>
 <j2ee:primkey-field>name</j2ee:primkey-field>
 </lomboz:entityEjb>
 <lomboz:fieldMappings>
 <lomboz:fieldName>name</lomboz:fieldName>
 <lomboz:fieldType>java.lang.String</lomboz:fieldType>
 <lomboz:columnName>名称</lomboz:columnName>
 <lomboz:jdbcType>VARCHAR</lomboz:jdbcType>
 <lomboz:sqlType>varchar</lomboz:sqlType>
 <lomboz:readOnly>false</lomboz:readOnly>
 <lomboz:primaryKey>true</lomboz:primaryKey>
 </lomboz:fieldMappings>
 <lomboz:fieldMappings>
 <lomboz:fieldName>description</lomboz:fieldName>
 <lomboz:fieldType>java.lang.String</lomboz:fieldType>
 <lomboz:columnName>行业说明</lomboz:columnName>
 <lomboz:jdbcType>VARCHAR</lomboz:jdbcType>
 <lomboz:sqlType>varchar</lomboz:sqlType>
 <lomboz:readOnly>false</lomboz:readOnly>
 <lomboz:primaryKey>false</lomboz:primaryKey>
 </lomboz:fieldMappings>
 <lomboz:tableName>GroupTable</lomboz:tableName>
 <lomboz:dataSourceName></lomboz:dataSourceName>
 </lomboz:entity>
 </lomboz:EJB>
 <!--  end-lomboz-definition -->
 *
 * <!-- begin-xdoclet-definition -->
 * @ejb.bean name="Group"
 * jndi-name="Group"
 * type="CMP"
 *  primkey-field="name" 
 *  schema="GroupSchema" 
 *  cmp-version="2.x"
 *  view-type = "local"
 *  data-source=""
 * 
 *  @ejb.persistence 
 *   table-name="GroupTable" 
 * 
 *
 * 
 * @ejb.finder 
 *    query="SELECT OBJECT(a) FROM GroupSchema as a"  
 *    signature="java.util.Collection findAll()"  
 *
 * @ejb.pk class="java.lang.String"
 * <!-- end-xdoclet-definition -->
 * @generated
 **/
public abstract class GroupBean implements javax.ejb.EntityBean {
 /**
  * @ejb.create-method
  */
 public java.lang.String ejbCreate(String name, String description)
  throws javax.ejb.CreateException {
  // EJB 2.0 spec says return null for CMP ejbCreate methods.
  setName(name);
  setDescription(description);
  return null;
 }
 /**
  * The container invokes this method immediately after it calls ejbCreate.
  */
 public void ejbPostCreate(String name, String description)
  throws javax.ejb.CreateException {
 }
 /**
  * CMP Field name
  * @return the name
  * @ejb.persistent-field 
  * @ejb.persistence
  *    column-name="名称"
  *     jdbc-type="VARCHAR"
  *     sql-type="varchar(24)"
  *     read-only="false"
  * @ejb.pk-field 
  *
  * @ejb.interface-method
  */
 public abstract java.lang.String getName();
 /**
  * @param java.lang.String the new name value
  * @ejb.interface-method
  */
 public abstract void setName(java.lang.String name);
 /**
  * CMP Field description
  * @return the description
  * @ejb.persistent-field 
  * @ejb.persistence
  *    column-name="行业说明"
  *     jdbc-type="VARCHAR"
  *     sql-type="varchar(24)"
  *     read-only="false"
  *  
  *
  * @ejb.interface-method
  */
 public abstract java.lang.String getDescription();
 /**
  * @param java.lang.String the new description value
  * @ejb.interface-method
  */
 public abstract void setDescription(java.lang.String description);
 //########################   Select method     ##############################
 /**
  * Select method
  * @ejb.select
  *    query = "SELECT user.email  FROM GroupSchema AS g, IN (g.users) AS user  WHERE g.name = ?1" 
  *              
  */
 public abstract java.util.Collection ejbSelectUserIDs(String groupName)
  throws javax.ejb.FinderException;
 /**
  * Home method
  * @throws FinderException
  * @ejb.home-method  view-type = "local"
  */
 public java.util.ArrayList ejbHomeGetUserIDs(String groupName)
  throws javax.ejb.FinderException {
  return (java.util.ArrayList) ejbSelectUserIDs(groupName);
 }
// ########################   CMR Relationship     ############################## 
 /**
  * Getter for CMR Relationship
  *
  * @ejb.interface-method   view-type="local"
  * @ejb.relation           name = "GroupsHaveUserInfos"
  *                         role-name = "GroupHasUserInfos"
  *                         target-multiple = "no"
  */
 public abstract java.util.Collection getUsers();
 /**
  * Setter for CMR Relationship
  *
  * @ejb.interface-method   view-type="local"
  */
 public abstract void setUsers(java.util.Collection value);
}
 
二、在UserManagementBean中添加业务方法
 
1. 增加一个 GroupLocalHome 的变量 groupHome,并将它放入 ejbCreate 和 ejbPassivate 方法中。
 
2. 依次增加以下几个业务方法。

UserManagementBean中有关 GroupBean 的部分(很简单)

 //**********************************************************************
 //                    一对多的双向关系
 //**********************************************************************
 /**
  * 创建组别
  * @throws CreateException
  * @ejb.interface-method view-type="remote"
  */
 public void createGroup(String groupName, String description)
  throws CreateException {
  groupHome.create(groupName, description);
 }
 /**
  * 删除组别
  * @throws RemoveException
  * @throws EJBException
  * @ejb.interface-method view-type="remote"
  */
 public void removeGroup(String groupName)
  throws EJBException,
  RemoveException {
  groupHome.remove(groupName);
 }
 
 
 /**
  * 显示所有组别
  * @throws FinderException
  * @ejb.interface-method view-type="remote"
  */
 public ArrayList getGroups() throws FinderException {
  ArrayList groupList = new ArrayList(30);
  Iterator iter = groupHome.findAll().iterator();
  while (iter.hasNext()) {
   GroupLocal group = (GroupLocal) iter.next();
   groupList.add(group.getName());
  }
  return groupList;
 }
 
 /**
  * 将用户添加到组
  * @throws FinderException
  * @ejb.interface-method view-type="remote"
  */
 public void moveUserToGroup(String email, String groupName)
  throws FinderException {
  UserInfoLocal user = infoHome.findByPrimaryKey(email);
  GroupLocal group = groupHome.findByPrimaryKey(groupName);
  user.setGroup(group);
 }
 /**
  * 验证用户所在组
  * @throws FinderException
  * @ejb.interface-method view-type="remote"
  */
 public boolean inGroup(String email, String groupName)
  throws FinderException {
  UserInfoLocal user = infoHome.findByPrimaryKey(email);
  return user.getGroup().getName().equals(groupName);
 } 
 /**
  * 给一组用户增加权限
  * @throws FinderException
  * @ejb.interface-method view-type="remote"
  */
 public void addRoleToUsers(String groupName, String roleName)
  throws FinderException {
  GroupLocal group = groupHome.findByPrimaryKey(groupName);
  RoleLocal role = roleHome.findByPrimaryKey(roleName);
  Iterator iter = group.getUsers().iterator();
  while (iter.hasNext()) {
   UserInfoLocal user = (UserInfoLocal) iter.next();
   user.getUser().getRoles().add(role);
  }
 }
 /**
  * 通过 ejb.finder 输出某组别的用户
  * @throws FinderException
  * @ejb.interface-method view-type="remote"
  */
 public ArrayList getUserIDsInGroup1(String groupName) 
        throws FinderException {
  ArrayList userList = new ArrayList(30);
  GroupLocal group = groupHome.findByPrimaryKey(groupName);
  Iterator iter = group.getUsers().iterator();
  while (iter.hasNext()) {
   UserInfoLocal element = (UserInfoLocal) iter.next();
   userList.add(element.getEmail());
  }
  return userList;
 }
 
 /**
  * 通过 ejb.select 输出某组别的用户
  * Business method
  * @throws FinderException
  * @ejb.interface-method  view-type = "remote"
  */
 public ArrayList getUserIDsInGroup2(String groupName) 
         throws FinderException {  
  return groupHome.getUserIDs(groupName);
 }
    
 
3.  好了,保存,Generate EJB Classes,启动MySql, 启动JBoss服务器, Deploy Module 。
如果一切正常,则会在 cmp_sample 库中自动建立一个表:grouptable。
 
 
 
三、创建客户端
 
1. 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client  Wizard:
  创建一个 CMPClient4.java 文件 (步骤同前两篇文章一样)。
 
2. 修改生成的 CMPClient4.java,调用UserManagementBean中的方法。
   这里给出了完整的源代码:

CMPClient4.java

/*
 * 创建日期 2005-1-26
 *
 * 作者:javamxj(分享java快乐)
 */
package javamxj.ejb.client;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import javamxj.ejb.cmp.UserManagement;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
 * @author pc
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class CMPClient4 {
 private javamxj.ejb.cmp.UserManagementHome getHome() throws NamingException {
  return (javamxj.ejb.cmp.UserManagementHome) getContext().lookup(
    javamxj.ejb.cmp.UserManagementHome.JNDI_NAME);
 }
 private InitialContext getContext() throws NamingException {
  Hashtable props = new Hashtable();
  props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
  props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
  // This establishes the security for authorization/authentication
  // props.put(InitialContext.SECURITY_PRINCIPAL,"username");
  // props.put(InitialContext.SECURITY_CREDENTIALS,"password");
  InitialContext initialContext = new InitialContext(props);
  return initialContext;
 }
 public void testBean() {
  try {
   javamxj.ejb.cmp.UserManagement userMgmt = getHome().create();
   
   createUsers(userMgmt);
   System.out.println("输出group表中的组名:");
   printList(userMgmt.getGroups()); 
   
   System.out.println("改动前,通过 ejb.finder 输出组别为IT的用户");
   printList(userMgmt.getUserIDsInGroup1("IT"));
   System.out.println("改动:将lisi@bbb.ccc添加到IT组");
   userMgmt.moveUserToGroup("lisi@bbb.ccc", "IT");
   
   System.out.println("改动后,通过 ejb.select 输出组别为IT的用户");
   printList(userMgmt.getUserIDsInGroup2("IT"));
              
   System.out.println("通过用户组给用户增加权限");
   userMgmt.addRoleToUsers("IT", "manager");
            
   System.out.println("验证用户所在组");
   if (userMgmt.inGroup("javamxj@yahoo.com.cn", "IT")) {
    System.out.println("javamxj is in the IT group");
   } else if (userMgmt.inGroup("javamxj@yahoo.com.cn", "marketing")) {
    System.out.println("javamxj is now in the marketing group");
   }
  } catch (RemoteException e) {
   e.printStackTrace();
  } catch (CreateException e) {
   e.printStackTrace();
  } catch (NamingException e) {
   e.printStackTrace();
  } catch (FinderException e) {
   e.printStackTrace();
  }
 }
 
 // 创建用户
 public static void createUsers(UserManagement userMgmt)
   throws RemoteException, CreateException {
  System.out.println("向Group表中添加数据");
  userMgmt.createGroup("Marketing", "市场组");
  userMgmt.createGroup("Engineering", "工程组");
  userMgmt.createGroup("Sales", "销售组");
  userMgmt.createGroup("IT", "信息科技组");
 }
 
 //  输出ArrayList
 private static void printList(ArrayList list) {
  Iterator i = list.iterator();
  while (i.hasNext()) {
   Object details = (Object) i.next();
   System.out.println(details.toString());
  }
  System.out.println("");
 }
 public static void main(String[] args) {
  CMPClient4 test = new CMPClient4();
  test.testBean();
 }
}
 

3. 运行客户端
·控制台输出:
 
·数据库中相对应的表的改变:
 
 
 
 
 
三、创建客户端
 
1. 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client  Wizard:
  创建一个 CMPClient4.java 文件 (步骤同前两篇文章一样)。
 
2. 修改生成的 CMPClient4.java,调用UserManagementBean中的方法。
   这里给出了完整的源代码:

CMPClient4.java

/*
 * 创建日期 2005-1-26
 *
 * 作者:javamxj(分享java快乐)
 */
package javamxj.ejb.client;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import javamxj.ejb.cmp.UserManagement;
import javax.ejb.CreateException;
import javax.ejb.FinderException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
 * @author pc
 *
 * TODO 要更改此生成的类型注释的模板,请转至
 * 窗口 - 首选项 - Java - 代码样式 - 代码模板
 */
public class CMPClient4 {
 private javamxj.ejb.cmp.UserManagementHome getHome() throws NamingException {
  return (javamxj.ejb.cmp.UserManagementHome) getContext().lookup(
    javamxj.ejb.cmp.UserManagementHome.JNDI_NAME);
 }
 private InitialContext getContext() throws NamingException {
  Hashtable props = new Hashtable();
  props.put(InitialContext.INITIAL_CONTEXT_FACTORY,
    "org.jnp.interfaces.NamingContextFactory");
  props.put(InitialContext.PROVIDER_URL, "jnp://127.0.0.1:1099");
  // This establishes the security for authorization/authentication
  // props.put(InitialContext.SECURITY_PRINCIPAL,"username");
  // props.put(InitialContext.SECURITY_CREDENTIALS,"password");
  InitialContext initialContext = new InitialContext(props);
  return initialContext;
 }
 public void testBean() {
  try {
   javamxj.ejb.cmp.UserManagement userMgmt = getHome().create();
   
   createUsers(userMgmt);
   System.out.println("输出group表中的组名:");
   printList(userMgmt.getGroups()); 
   
   System.out.println("改动前,通过 ejb.finder 输出组别为IT的用户");
   printList(userMgmt.getUserIDsInGroup1("IT"));
   System.out.println("改动:将lisi@bbb.ccc添加到IT组");
   userMgmt.moveUserToGroup("lisi@bbb.ccc", "IT");
   
   System.out.println("改动后,通过 ejb.select 输出组别为IT的用户");
   printList(userMgmt.getUserIDsInGroup2("IT"));
              
   System.out.println("通过用户组给用户增加权限");
   userMgmt.addRoleToUsers("IT", "manager");
            
   System.out.println("验证用户所在组");
   if (userMgmt.inGroup("javamxj@yahoo.com.cn", "IT")) {
    System.out.println("javamxj is in the IT group");
   } else if (userMgmt.inGroup("javamxj@yahoo.com.cn", "marketing")) {
    System.out.println("javamxj is now in the marketing group");
   }
  } catch (RemoteException e) {
   e.printStackTrace();
  } catch (CreateException e) {
   e.printStackTrace();
  } catch (NamingException e) {
   e.printStackTrace();
  } catch (FinderException e) {
   e.printStackTrace();
  }
 }
 
 // 创建用户
 public static void createUsers(UserManagement userMgmt)
   throws RemoteException, CreateException {
  System.out.println("向Group表中添加数据");
  userMgmt.createGroup("Marketing", "市场组");
  userMgmt.createGroup("Engineering", "工程组");
  userMgmt.createGroup("Sales", "销售组");
  userMgmt.createGroup("IT", "信息科技组");
 }
 
 //  输出ArrayList
 private static void printList(ArrayList list) {
  Iterator i = list.iterator();
  while (i.hasNext()) {
   Object details = (Object) i.next();
   System.out.println(details.toString());
  }
  System.out.println("");
 }
 public static void main(String[] args) {
  CMPClient4 test = new CMPClient4();
  test.testBean();
 }
}
 

3. 运行客户端
·控制台输出:
 
·数据库中相对应的表的改变:
 
 


 

多物理场光学仿真软件:COMSOL_(10).激光器与谐振腔仿真 定义Nd:YAG晶体的材料属性% 折射率% 吸收系数% 发射截面% 定义光泵浦源% 泵浦光波长% 泵浦光强度% 泵浦光方向% 定义全反射镜% 选择边界% 完美电导体边界条件% 定义部分反射镜% 选择边界% 反射率边界条件% 反射率通过 COMSOL 对激光器和光学谐振腔进行仿真,可以全面评估激光器的性能,包括输出功率、效率、稳定性和模式选择等。这些仿真结果为激光器的设计和优化提供了重要的参考依据。 阅读详情

相关推荐

Fedproto:原型聚合的联邦学习框架

文中说明,联邦学习通过计算传递梯度聚合模型时,客户端之间的异构性通常会阻碍模型优化收敛和泛化性能。故本文提出新的FedProto框架,将梯度替换成为原型,通过计算、聚合从不同客户端收集到的本地原型,然后将全局原型发送回所有客户端,以规范本地模型的训练。对每个客户机进行局部训练的目的是最小化对本地数据的分类损失,同时保持生成的本地原型足够接近相应的全局原型(损失函数最小+正则)。什么是原型?文中提到:“

weixin_47754029的博客 2650

Eclipse快速上手Hibernate--7. 关联映射(一对多) (1)

    Hibernate中的关联(Association)映射主要有三种:一对一关联,一对多(或多对一)关联,多对多关联。每种关联都可以分为单向和双向两种。    上篇文章《Eclipse快速上手Hibernate--5. 关联映射(一对一) 》已经说了一对一关联,这次谈谈一对多(或多对一)关联。至于环境设置,可以参考这个系列的前面几篇文章。       这篇文章主要是参考《Hibernate入

分享Java快乐 1万+

西门子机床数据采集实战:从828D到840DSL的CNC设备联网与实时监控

本文深入探讨了西门子机床数据采集的实战方案,重点解析了从828D到840DSL等CNC设备如何实现免授权、低成本联网与实时监控。文章通过对比不同型号系统的数据接口差异,提供了详细的配置步骤、核心数据点清单以及避坑指南,旨在帮助工厂技术人员经济高效地挖掘机床数据价值,提升生产管理效率。

weixin_29181861的博客 1332

基于TCP和eclipse的双向聊天

服务器 import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Demo2 { static boolean fig = true; public static void main(String[] args) throws IOException { Scanner is = new Scanner(Syste

qq_45574769的博客 313

docker配置国内镜像源

【代码】docker配置国内镜像源。

愿听风成曲 9616

第9.3章 从CMake基础到自动驾驶实战:构建跨平台C/C++项目的全能指南

《CMake构建实战:项目开发卷》精要指南 本文系统梳理了许宏旭《CMake构建实战》核心内容,涵盖C++构建全流程: 基础构建:详解MSVC/GCC编译器使用、Makefile编写及静态/动态库构建方法 CMake核心:解析语法结构、变量控制、文件操作等关键命令,阐述项目全生命周期管理 实战应用:通过快速排序、手写数字识别项目演示现代CMake实践,特别针对自动驾驶领域给出多传感器融合、SLAM等场景的CMake配置方案 特色价值:本书填补了官方文档实例不足的空白,提供300+代码示例,是掌握工业级C++

行知SLAM 1343

Eclipse快速上手Hibernate--7. 关联映射(一对多) (3)

    前面两篇文章《关联映射(一对多) (1)》、《关联映射(一对多) (2)》分别谈了“单向一对多关系”与“单向多对一关系”,双向一对多关系就是二者的组合。为了更好地提高执行效率,需要将“多”的一端设为主控方,就是将关联关系的维护工作交给“多”的一端。    以《关联映射(一对多) (2)》为基础,只要改动一下Room类即可。  · 修改Room类,仅仅是添加了关联User类的代码。Room.

分享Java快乐 5290

低功耗设计-ir drop的signoff corner怎么选择?

2.tt的(tt85 是比较接近芯片真实工作情况的);我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?有要求就用要求的就好,没要求前两种看公司需求。3.signoff文档要求的;有几个方向,看公司需求吧。

m0_61544122的博客 1595

表间的关系一对多/一对一/多对多关系是怎样建立的?

2.外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。 1.一对多,在多的一方建立外键(外键指向一的主键) 母亲与孩子的关系:母亲,孩子两个实体 母亲表:ID(P),名字,年龄,性别 孩子表:ID(P),名字,年龄,性别 以上关系:一个妈妈可以在孩子表中找到多条记录(也可能是一条),但是一个孩子只能找到一个妈妈 是一种典...

weixin_33768481的博客 1229

uniapp 如何封装实现任意页面都能使用的全局弹窗

项目内容场景全局监听消息提示难点uniapp 无法全局挂载组件解决方案动态创建 DOM + 动态 Vue 实例优势跨页面 / 不依赖页面组件树 / 灵活调用如果你使用的是小程序平台,DOM 操作可能受限,需要用或方式兼容处理。想支持多个弹窗堆叠?你可以扩展,加个弹窗队列管理器。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 945

linux内核协议栈 TCP选项之SACK选项概述

目录 1SACK概述 1.1 SACK允许选项 1.2 SACK选项 2SACK允许选项的发送 2.1 SYN段发送 2.2 接收SYN段 2.2.1 struct tcp_options_received 2.2.2 tcp_parse_options() 2.3 发送SYN+ACK段 3D-SACK 1SACK概述 标准的TCP确认机制中,如果发送方发送了0-1000序号之间的数据,接收方收到了0-100、300-1000,那么接收方只能向发送方确认101,这时发送方会重...

2732

EclipseLink学习(三)--- 一对多映射

在JPA的规范中,对于一对多可以有两种解释:OneToMany(一对多);ManyToOne(多对一)。其实这两个解释也就是看问题的角度不同而已,原理都是一样的。   应用场景:学生和公寓,从学生角度来看就是多对一;从公寓角度来看就是一对多。 ManyToOne:   学生实体: package model;   import javax.persi

My Devil's Cry 1640

【原创教程】西门子1500与施耐德伺服的通讯以及调试

该函数块主要描述伺服的手动,左边的引脚Forward是指伺服手动正转,Backward是指伺服手动反转,Fast是指手动的某个方向为快速运行,TipPos手册上描述为固定值,WaitTIme是指伺服手动的相应时间,VeloSlow指伺服手动正常慢速运动的速度,VeloFast指伺服手动快速运动的速度,Acceleration是指伺服手动的加速度,Decelertion是指伺服手动的减速度。该函数块用于伺服停止,左边的引脚Execute为伺服停止执行,Deceleration含义为减速,Axis为轴。

Qinmingyue13的博客 1375

Eclipse快速上手EJB -- 5. 一对多的双向关系的CMR(1)

        这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 《EJB - CMP/CMR 介绍》 改编而成的,这是一个系列,共有4篇文章。这篇文章综合了那4篇文章,看这篇文章前一定要参考一下,这样理解起来很方便,不过我做了部分修改,原理基本还是不变的。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse

分享Java快乐 4492

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Eclipse快速上手EJB -- 5. 一对多的双向关系的CMR(2)

二、在UserManagementBean中添加业务方法 1. 增加一个 GroupLocalHome 的变量 groupHome,并将它放入 ejbCreate 和 ejbPassivate 方法中。  2. 依次增加以下几个业务方法。 UserManagementBea

分享Java快乐 3891

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)

        这个系列文章我是根据 Rick Hightower 发表在 IBM 网站的文章 《EJB - CMP/CMR 介绍》 改编而成的,这是一个系列,共有4篇文章。这篇文章综合了那4篇文章,看这篇文章前一定要参考一下,这样理解起来很方便,不过我做了部分修改,原理基本还是不变的。关于 CMP 方面的知识我不说了,我这里只是介绍如何使用 Lomboz 和 JBoss-IDE 在Eclipse

分享Java快乐 8712

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Eclipse快速上手EJB -- 3. 一对一的双向关系的CMR(3)

三、创建客户端Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR(1)Eclipse快速上手EJB -- 3. 一对一的双向关系的CMR(2)1. 右击 src 文件夹 ->新建 ->Lomboz EJB Test Client  Wizard:  2. 修改生成的 CMPClient2.java,调用UserManagementBean中的方法。

分享Java快乐 5759

Eclipse快速上手EJB -- 3. 设计一对一的双向关系的CMR

一、设计实体Bean :UserInfoBean 1. 建立主体部分: ● 在 CMP_Sample 项目中,右击“src” ->新建 ->Lomboz EJB Creation Wizard :· 包(K) :javamxj.ejb.cmp· 名称(M): UserInfo· EJB Type: 选择 Container Managed Entity EJB  

永远在跟随,从未去超越 1251

Eclipse最新的开发EJB文章

2005年01月27日 今天装了JDK那个叫5的东东    摘要:今天从sun站点http://java.sun.com/j2se/1.5.0/download.jsp下载了叫JDK 5.0东东    (全文共1383字)——点击此处阅读全文发表于 @ 2005年01月27日 10:02 PM | 评论 (0) Eclipse快速上手EJB -- 5. 一对多的双向关系的CM

qiqijava的专栏 4329

Eclipse快速上手指南的技术文章

这是Coolingverse专栏上有关Eclipse快速上手指南的文章:Eclipse及其插件下载网址大全 Eclipse 3.1.1+中文包release Eclipse快速上手指南之使用基础Eclipse启动参数大全 在Eclipse中使用版本控制:Eclipse快速上手指南之使用CVS 利用CVSNT在Eclipse中使用CVS--1.安装与配置CVSNT  

roger007的专栏 1578

EJB3.0一对多关系

      EJB3.0使用注释@OneToMany实现一对多关系,使用@JoinColumn(name="")说明关联的外键名,使用FetchType说明“多”端数据项的装载方式。     但是在一个Bean中如果存在多个外键关系,即有多个数据项都是一对多关系,则只有一个能使用fetch=FetchType.EAGER,其余均为LAZY方式。否则,JBOSS将抛出cannot simulta

silentsunshine的专栏 891

EJB 单向一对多

package com.ericsson.iptv.streamtag.entity; import java.io.Serializable; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column...

老张的专栏 238
上一篇: Eclipse快速上手EJB -- 4. 多对多的单向关系的CMR
下一篇: RMI、CORBA、IIOP简单实例--1. RMI
johnsonTj
博客等级 码龄23年 26粉丝 118原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值