精华内容
下载资源
问答
  • 如果知道哪个表里的数据的话可以用左连接,但是这是不知道哪个数据比较,所以这里使用全连接 select ISNULL(a.id,b.id) as [id], a.des, b.des from a full join b on a.id = b.id; 好简单的东西,浪费...

    我大概画画,目的就是这样:A和B相同的主键的话内容要合并在一起

    如果知道哪个表里的数据多的话可以用左连接,但是这个是不知道哪个表数据比较多,所以这里使用全连接


    select 
    ISNULL(a.id,b.id) as [id],
    a.des,
    b.des
    from a 
    full join b on a.id = b.id;

    好简单的东西,浪费了我半天大哭


    展开全文
  • 主键关联而相关的两张中的行共享相同的主键值。这种方法的主要困难在于,确保被关联的  实例在保存对象时分配了相同的主键值。  第一步:用xml映射主键关联  view plaincopy to clipboard...
    共享的主键关联: 
    由主键关联而相关的两张表中的行共享相同的主键值。这种方法的主要困难在于,确保被关联的 
    实例在保存对象时分配了相同的主键值。 
    第一步:用xml映射主键关联 
    1. <class name="User"   
    2. ....  
    3. <one-to-one name="address" class="Address" cascade="update">  
    4. </one-to-one>  

    第二步:外标识符生成器 
    如果Address实例被保存,它就需要获取User对象的主键值。你无法启动一个常规的标示符生成器, 
    假设是数据库序列。用于Address的这个特殊的foreign标示符生成器,必须知道从哪里获取正确 
    的主键值。 
    创建Address和User之间的这个标示符绑定,起第一步是双向关联。把一个新的user属性添加 
    到Address属性: 
    1. <class name="Address"  
    2. ...  
    3. <one-to-one name="user" class="User" constrained="true"/>  

    这个映射让关联变成了双向,constrained="true"声明了把address的主键添加到user主键的外键约束。 
    现在可以给Address对象使用特殊的foreign标示符生成器了: 
    1. <class name="Address" table="ADDRESS">  
    2.     <id name="addressId" column="ADDRESS_ID" type="long">  
    3.         <generator class="foreign">  
    4.             <param name="property">user</param>  
    5.         </generator>  
    6.     </id>  
    7.     <property name="street" type="string" column="street"/>  
    8.     <property name="city" type="string" column="city"/>  
    9.     <one-to-one name="user" class="User" constrained="true"/>  
    10. </class>  

    (当Address被保存时,从属性中提取主键值。user属性是对User对象的一个引用;因而,插入的主键值与 
    这个实例的主键值相同。) 
    需要双向才可以保存成功: 
    1. User user = new User();  
    2. user.setUserName("test");  
    3.   
    4. Address address = new Address("street""city");  
    5.   
    6. user.setAddress(address);  
    7. //不添加报错:attempted to assign id from null one-to-one property: user  
    8. address.setUser(user);  
    9.   
    10. Integer msgId = (Integer) session.save(user);  
    11.   





    利用注解的共享主键: 
    JPA用@OneToOne注解支持一对一的实体关联。要映射User类中address的关联为共享主键关联,还需要@PrimaryKeyJoinColumn注解: 
    1. @Entity  
    2. public class User implements Serializable {  
    3.     @Id  
    4.     @GeneratedValue  
    5.     private Integer userId;  
    6.     @Column(name="USER_NAME",length=100)  
    7.     private String userName;  
    8.     @OneToOne(cascade=CascadeType.PERSIST)  
    9.     @PrimaryKeyJoinColumn  
    10.     private Address address;   

    JPA规范没有包括处理共享主键生成问题的标准方法,这意味着在保存Address实例的标示符之前,你要负责正确的设置他。 
    hibernate的扩展注解: 
    1. @Entity  
    2. public class Address implements Serializable {  
    3.     @Id  
    4.     @GeneratedValue(generator="userForeignGenerator")  
    5.     @org.hibernate.annotations.GenericGenerator(name="userForeignGenerator",  
    6.             strategy="foreign",  
    7.             parameters=@Parameter(name="property",value="user"))  
    8.     @Column(name="ADDRESS_ID")        
    9.     private Integer addressId;  
    10.     private String street;  
    11.     private String city;  
    12.     @OneToOne  
    13.     private User user;    

    保存: 
    1. User user = new User("name");  
    2.         Address address = new Address("street""city");  
    3.         user.setAddress(address);  
    4.         //不添加报错:attempted to assign id from null one-to-one property: user  
    5.         address.setUser(user);  
    6.           
    7.         em.persist(user);   

    展开全文
  • 情景:用户和订单是一对多的关系,即 一个 Userinfo 对应对应有 多个 Order 如果我在EF中,先创建一个用户,然后创建3个订单,然后关联这1个用户...添加的多个实体可能主键相同 原因可能是: 当我们添加2个用户的时...

    情景:用户表和订单表是一对多的关系,即 一个 Userinfo  对应对应有 多个 Order表

    image

     

    如果我在EF中,先创建一个用户,然后创建3个订单,然后关联这1个用户和3个订单的关系,毫无问题.

    但是:当我如果想创建2个用户,6个订单,并且分别去关联的时候,就提示报错

    image

    无法确定“XXX”关系的主体端。添加的多个实体可能主键相同

    原因可能是:

    当我们添加2个用户的时候,2个用户的id主键都是0,这样当保存到数据库的时候,就报错了. (疑问:但是订单1到6,他们的id也是主键,也是0,为嘛就不报错呢?)

    解决方法

    1:要么你的userinfo主表里面的数据,一个一个的添加.例如先添加用户1,然后保存用户1和订单123的关系.然后创建用户2,然后保存用户2和订单456的关系

     

    2:给UserInfo添加的时候,设置一个假的Id, 例如 Userinfo1 的id设置为1,Userinfo2的id 设置为2,这是我们自己手动设置的假的id,然后EF在关联 用户1和订单123,用户2和订单456的时候,由于发现用户1和用户2的id主键是不同的,所以就可以判断为是2个不同的主体端了.

    实际EF执行到数据库的时候,由于ID是主键,所以EF是不会理会我们自己手动创建的假的id主键的.

    image

    3:相当于是1的改版,我们先把主题端的用户1和用户2给保存到数据库,这样他们的id就会不一致,就不会提示 “添加的多个实体可能主键相同了”

    image

     

    参考资料

    http://stackoverflow.com/questions/8530581/multiple-added-entities-may-have-the-same-primary-key-in-entity-framework

    http://www.cnblogs.com/tukzer/archive/2013/04/20/3033326.html

    转载于:https://www.cnblogs.com/joeylee/p/3805901.html

    展开全文
  • 相对的,具有相同注解的实体被视为一对一的关系,这样两个表就省略了外键关联。 demo实例 客户地址管理,一个客户对应一个地址,实体间使用相同主键。 1、建立java工程 2、导入hibernate和MySql相关类库。 ...

    由于两个实体类是一对一的关系,因此可以设置两个实体类使用相同的主键。相对的,具有相同注解的实体被视为一对一的关系,这样两个表就省略了外键关联。


    demo实例

    客户地址管理,一个客户对应一个地址,实体间使用相同的主键。


    1、建立java工程


    2、导入hibernate和MySql相关类库。

      详见之前的博客hibernate单边一对多关系中的配置。


    3、建立实体类

    Customer为客户的实体类,Address为客户的地址实体类;

    两个实体类之间是一对一的属性,两者之间使用相同的主键而没有使用外键约束。

    配置时使用OneToOne指定一对一关系,使用@PrimaryKeyJoinColumn指定两个实体类之间使用相同的主键。


    客户的实体类Customer.java代码如下:

    package com.arvinfei.hibernate.bean;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    import javax.persistence.PrimaryKeyJoinColumn;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "tb_customer")
    public class Customer {
    
    	@Id
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Integer id;
    
    	private String name;
    
    	@OneToOne
    	@PrimaryKeyJoinColumn
    	private Address address;
    
    	public Address getAddress() {
    		return address;
    	}
    
    	public void setAddress(Address address) {
    		this.address = address;
    	}
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    }
    

    地址的实体类Address.java代码如下:

    两个实体类使用主键进行一对一关联,这里两个主键为整形,其中客户使用了自增长属性,那么地址就不能在使用自增长属性,否则可能会是两个实体对象的id不一致。hibernate也不会自动保证两个id相同,此时需要手动设置id以保证两个id一致(即将客户自动分配到的id设置给地址)。

    package com.arvinfei.hibernate.bean;
    
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.OneToOne;
    import javax.persistence.PrimaryKeyJoinColumn;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "tb_address")
    public class Address {
    
    	@Id
    	// @GeneratedValue(strategy = GenerationType.IDENTITY)//不使用自动增长
    	private Integer id;
    
    	@OneToOne
    	@PrimaryKeyJoinColumn
    	private Customer customer;
    
    	private String address;
    
    	private String zip;
    
    	private String telephone;
    
    	public String getAddress() {
    		return address;
    	}
    
    	public void setAddress(String address) {
    		this.address = address;
    	}
    
    	public Customer getCustomer() {
    		return customer;
    	}
    
    	public void setCustomer(Customer customer) {
    		this.customer = customer;
    	}
    
    	public Integer getId() {
    		return id;
    	}
    
    	public void setId(Integer id) {
    		this.id = id;
    	}
    
    	public String getTelephone() {
    		return telephone;
    	}
    
    	public void setTelephone(String telephone) {
    		this.telephone = telephone;
    	}
    
    	public String getZip() {
    		return zip;
    	}
    
    	public void setZip(String zip) {
    		this.zip = zip;
    	}
    
    }
    

    4、在hibernate的配置文件中添加实体类映射关系

    <?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">
    
    <!-- Generated by MyEclipse Hibernate Tools.                   -->
    <hibernate-configuration>
    
    <session-factory>    
        <property name="dialect">
            org.hibernate.dialect.MySQLDialect
        </property>
        <property name="connection.url">
            jdbc:mysql://localhost:3306/one2onebykey?characterEncoding=UTF-8
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">admin</property>
        <property name="connection.driver_class">
            com.mysql.jdbc.Driver
        </property>
        <property name="show_sql">true</property>
        <property name="hbm2ddl.auto">create</property>    
        <mapping class="com.arvinfei.hibernate.bean.Address" />
        <mapping class="com.arvinfei.hibernate.bean.Customer" />
    
    </session-factory>
    
    </hibernate-configuration>
    

    5、新建测试代码

    package com.arvinfei.hibernate.test;
    
    import java.util.List;
    
    import org.hibernate.Session;
    
    import com.arvinfei.hibernate.bean.Address;
    import com.arvinfei.hibernate.bean.Customer;
    import com.arvinfei.hibernate.util.HibernateSessionFactory;
    
    public class One2OneKey {
    
    	@SuppressWarnings("all")
    	public static void main(String[] args) throws Exception {
    
    		Customer customer = new Customer();
    		customer.setName("Helloween");
    
    		Address address = new Address();
    		address.setAddress("北京市海淀区中关村");
    		address.setTelephone("010-77883210");
    		address.setZip("100001");
    
    		// address.setCustomer(customer);
    
    		Session session = HibernateSessionFactory.getSession();
    		session.beginTransaction();
    
    		// 保存 customer,数据库会为 customer 自动分配 ID
    		session.persist(customer);
    
    		// 要手工设置 address 的 ID 保证两个ID一致
    		address.setId(customer.getId());
    
    		// 保存 address
    		session.persist(address);
    
    		session.flush();
    
    		List<Customer> list = session
    				.createQuery(" select c from Customer c where c.name = :name ")
    				.setParameter("name", "Helloween").list();
    
    		for (Customer c : list) {
    			session.refresh(c);
    			System.out.println("客户姓名:" + c.getName());
    			System.out.println("\t电话:" + c.getAddress().getTelephone());
    			System.out.println("\t邮编:" + c.getAddress().getZip());
    			System.out.println("\t地址:" + c.getAddress().getAddress());
    		}
    
    		session.getTransaction().commit();
    		session.close();
    	}
    }
    

    6、修改HibernateSessionFactory

    修改HibernateSessionFactory中的sessionFactory配置方式,默认为xml配置方式,demo中使用注解进行配置,所以需要进行简单修改。

    7、运行测试

    (1)、打开并连接到mysql数据库;

    (2)、在mysql中创建Many2Many数据库;

        create database one2onebykey character set 'utf8';   


    (3)、运行本测试工程,查看log输出。


    8、源码下载

    http://download.csdn.net/detail/yxtouch/9161295

    展开全文
  • 最近在项目中遇到一oracle修改的问题,但是想了好久才相出来,感觉此问题 应该很情况都会用到的,问题大概是这样的 一oracle数据库tab1中有这些数据 storeid title name number isread 1 www qqq...
  • 例如: item1 item2 name subject 1 1 lily maths 1 2 lily english 1 3 lily chinese 2 1 lucy maths 2 2 lucy english 现有的数据位 lily maths lily english ... lucy english
  • 数据是原始就存在的,里面存在两个主键: 当建好实体类,然后用jpa去关联操作查询,(根据StudyId)去进行查询的时候,发现原本可以有八条不一样的记录,只是StudyId相同,其他的不同,这时候,出来确实是八条...
  • 我们手动更新关系时,方法是:删除原来关系,插入新关系,而EF的作法不是这样,它是先比较现在有集合与数据表里的内容是否相同,如果相同不进行操作,如果没有就插入,如果有就删除,性能上有了一提...
  • 在数据库开发中,很时候建一个表的时候会使用一个数字类型来作为主键,使用自增长类型自然会更方便,只是本人从来不喜欢有内容不在自己掌控之中,况且自增长类型在进行数据库复制时会比较麻烦。所以本人一直使用...
  • 此篇不放存储过程实例了。 这是我在开发存储过程中碰到的耗时最久的一次问题,存储过程可以跑,但是得到的结果不是自己想要的, 排查了很久,发现是此句中的id惹的祸: SET projectInfoId =(SELECT id FROM temp....
  • 如题,我的系统中因为一个特定原因,需要一张自关联表(thisTable)来简化逻辑, 该表主键是自增的,结果发现无法添加记录, 错误消息:无法确定“db....添加的多个实体可能主键相同。 请问,有人解决过这个问题吗?
  • 主关键字是中的一个或多个字段,它的值用于唯一地标识中的某一条记录。 又可称为主键、主码,其列不能包含空值。 主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义。 .公共关键字(Common ...
  • 现在有2个表部分学校表和学校表 其中部分学校表在A库、学校表在B库 SCH_ID为关联主键 部分学校表 AUTO_ID USER_ID COTY_NO SCH_ID SCH_NO SCH_NAME 1 17 123 341289001 1 职业学院 学校表 SCH_ID SCH_NO SCH_...
  • 但我们系统的B有这么一限制,工号和生效日期是联合主键,也就是说,同一时间同一个人最多只能有一条晋升数据,显然,A的李四的数据没法同步过来,王五的数据没问题。 那么这时候我就要查出A有哪些数据是我们...
  • 联合主键的作用: 能够保证中的数据行之间组成联合主键的KEY至少有一KEY不相同
  • 最近学习一点数据库的基本知识,被一个问题困惑了许久:主键是唯一的索引,那么为何一个表可以创建多个主键呢? 其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为...
  • 主键、外键,主、从

    千次阅读 2017-02-17 10:59:35
    主关键字是中的一个或多个字段,它的值用于唯一地标识中的某一条记录。 又可称为主键、主码,其列不能包含空值。 主关键字是可选的,并且可在 CREATE TABLE 或 ALTER TABLE 语句中定义。   3.公共关键字...
  • 如何在数据库中建立复合主键

    万次阅读 2014-05-29 10:41:05
    (即多个字段同时作为主键主键是数据库的一个重要属性,建立主键可以避免中存在完全相同的记录,也就是说主键在一张中的记录值是唯一的。 建立主键有两种方法:一种是在数据库提供的GUI环境中建立,另一种...
  • 设置表字段的主键约束(PRIMARY KEY,PK) 主键的一个特殊字段,能唯一标识该中的每条信息。主键和记录的关系,如同身份证和人的关系。主键用来标识每个记录,...主键可以是单一的字段,也可以是多个字段的组合。
  • `full outer join` 一般在 SQL 中用于关联两个表取两个表的并集,百度搜索出来的都是用三个表嵌套取并集,尝试如果关联三个表平行关联,得出: 如果并列全关联,那么关键表与其他表如果关联主键相同的就会合并到同一...
  • 复合主键

    2019-10-04 07:21:14
    1.原因:当数据库创建表时,每个表只能有一个主键,但是如果想让多个列都成为主键时,就要用到复合主键。 条件:a.必须实现Serializable接口。 b.必须有默认的public无参数的构造方法。 c.必须覆盖equals和...
  • 此时,只有当组成复合主键的所有列的值都相同时,才不允许(把多个列同时重复才视为重复)。2、唯一键约束:用UNIQUE KEY修饰的列。 若某个列用UNIQUE KEY修饰,则其值只能在此中存在一份,不能重复。 ...
  • Oracle主键和联合主键

    千次阅读 2019-04-03 08:11:59
    同一个表的所有记录都有相同的字段定义。 对于关系表,有一个非常重要的约束,就是任意两条记录不能重复。不能重复不是指两条记录不完全相同,而是指能够通过某个字段唯一区分出不同的记录,这个字段被称为主键。 ...
  • PRIMARY KEY联合主键

    2020-12-14 09:32:40
    ①每个表只能定义一个主键 ②唯一性原则 即主键值必须唯一标识表中的每一行,且不能为 NULL,即表中不可能存在有相同主键值的两行数据 ③一个字段名只能在联合主键字段表中出现一次 ④联合主键的最小化原则 即联合...
  • 主键是数据库的一重要属性,建立主键可以避免中存在完全相同的记录,也就是说主键在一张中的记录值是唯一的。 建立主键有两种方法:一种是在数据库提供的GUI环境中建立,另一种是通过SQL语句执行建立,下面...
  • 主键约束

    2020-04-27 22:09:26
    2.2 级约束条件:在属性定义完毕后加上主键,既适用于唯一属性构成的主键,也适用于多个属性联合构成的主键。 3.主键的完整性约束:非空约束以及唯一约束。 全扫描会很耗时,所以为每条记录建立一个索引,再将...
  • 个表中可以存在一个主键或者多个主键,都是起到唯一约束的作用;查了相关资料,还了解到,复合主键和联合主键的区别,只是看是来源于单表(复合主键),还是来源于多表(联合主键);在我看来其实都一样,只是概念...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 863
精华内容 345
关键字:

多个表主键相同