时间:2016-01-21 09:21:38

标签: java database entity primary-key

我有两张桌子:

  • “TABLEA”

    primaryKey是column1和column2

  • “tableB的”

    primaryKey也是column1和column2,但附加了column4

-

问题是,“tableA”的primaryKey并不总是唯一的。然后有一个以上的结果。在这种情况下,我必须查看“tableB”。 primaryKeyB在tableB中区分“多于一个结果”。 如何使用扩展的primaryKey连接这两个表:如果findByPkTableA的结果多于一个结果,则使用findByPkTableB。或者是否可以在tableA中加载tableB的列?或者使用SecondaryTable?

构建数据库表:

the construktion of databasetable

代码

primaryKey A

@Embeddable
@Data
public class PkTableA implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -6732213911212534660L;

@Column(name="column_1")
private int column1;

@Column(name="column_2")
private int column2;

//Getter Setter

}

primaryKey B

@Embeddable
@Data
public class PkTableB implements Serializable{

/**
 * 
 */
private static final long serialVersionUID = -6732213911212534660L;

@Column(name="column_1")
private int column1;

@Column(name="column_2")
private int column2;

@Column(name="column_4")
private int column4;

//Getter Setter

}

表A

@Entity
@Data
@Table(name="tableA")
public class TableA {

@EmbeddedId
private PkTableA id;

@Column(name="column_3")
private int column3;

//Getter Setter
}

表B

@Entity
@Data
@Table(name="tableB")
public class TableB {

@EmbeddedId
private PkTableB id;

@Column(name="column_5")
private int column5;

//Getter Setter

}

2 个答案:

答案 0 :(得分:0)

你有一些逻辑问题......

如果声明primary key (column1, column2),则不能有重复值,因为数据库不允许插入。

create table tableA
( column1 int not null,
  column2 int not null,
  column3 int not null,
 primary key (column1, column2));


insert into tableA values
(1,1,1),
(2,2,2),
(1,2,1);

我们在数据库中有以下行:

col1 col2 col3  1 1 1  2 2 2  1 2 1

如果我们尝试插入以下行:

insert into tableA values (1,1,5);

我们将遇到重复错误

#1062 - Duplicate entry '1-1' for key 'PRIMARY'

修改

加入两个表的唯一方法是

SELECT tableA.*, tableB.* 
FROM
    tableA JOIN tableB
    ON tableA.column1 = tableB.column1 AND
       tableA.column2 = tableB.column2

答案 1 :(得分:0)

如果您的主键包含多列不同的表...您可以尝试以下操作...

为tableB生成一个唯一的id并将其加入tableA ..

创建一个新实体,其中包括tableA的所有主键列和tableB

的连接列
    public class PrimaryKeyEntity 
    {
         private  string column1;
         private string column2;
         private pkTabelB joincolumnfromB;
   } 

然后在你的tableA实体中将它包含为idclass ...

 @IdClass(PrimaryKeyEntity.class)
 @Entity
 @Table(name="tableA")
 public class TableA {.....
 @Embedded
 PkTableB pkTableB