Java 外键也是主键的一部分

Java 外键也是主键的一部分,java,database,jpa,Java,Database,Jpa,在普通JPA或JPA+Hibernate扩展中,是否可以使用也是复合主键一部分的外键 @TableGenerator(name = "trial", table = "third", pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first") @Entity public class First{ @Id @GeneratedValue(strategy = Generation

在普通JPA或JPA+Hibernate扩展中,是否可以使用也是复合主键一部分的外键

@TableGenerator(name = "trial", table = "third",
        pkColumnName = "a" , valueColumnName = "b", pkColumnValue = "first")    
@Entity    
public class First{    
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "trial")
protected int a;

@OneToMany(mappedBy ="first", cascade = CascadeType.PERSIST)
@JoinColumn(name = "a")
protected List<Second> seconds;
}

class IDC implements Serializable{
 //@Column(name = "a", insertable = false, updatable = false)
    protected int a;
protected int b;
}

@Entity    
@IdClass(IDC.class)
public class Second{    
    @Id
  //@Column(name = "a", insertable = false, updatable = false)
protected int a;
@Id
protected int b;

    @ManyToOne
@JoinColumn(name = "a"/*, insertable = false, updatable = false*/)
First first;
}
@TableGenerator(name=“trial”,table=“third”,
pkColumnName=“a”,valueColumnName=“b”,pkColumnValue=“first”)
@实体
公共类第一{
@身份证
@GeneratedValue(策略=GenerationType.TABLE,generator=“试用”)
受保护的INTA;
@OneToMany(mappedBy=“first”,cascade=CascadeType.PERSIST)
@JoinColumn(name=“a”)
保护列表秒;
}
类IDC实现了可序列化{
//@列(name=“a”,insertable=false,updateable=false)
受保护的INTA;
受保护的int b;
}
@实体
@IdClass(IDC.class)
公共类第二{
@身份证
//@列(name=“a”,insertable=false,updateable=false)
受保护的INTA;
@身份证
受保护的int b;
@许多酮
@JoinColumn(name=“a”/*,insertable=false,updateable=false*/)
首先;
}
主要内容:

公共类持久器{
公共静态void main(字符串[]args){
First affirst=新的First();
Second aSecond=新的第二个();
第二个b=300;
List scnds=new ArrayList();
添加(一秒钟);
第一秒=scnds;
第二个第一个=第一个;
aEntityManager.getTransaction().begin();
坚持(第一次);
aEntityManager.getTransaction().commit();
}}
问题在第二节课上:

如果我在字段“a”处设置“insertable=false,Updateable=false”,则会引发异常:

“参数索引超出范围。4不在有效值1和3之间”

如果我在@manyToOne的关系中设置“insertable=false,updateable=false”,那么它将运行,但在表“Second”的“a”中设置0

目标:在Second.a中设置First.a的生成值

/////////////////////////////

创建数据库的sql语句:

首先创建表( 整数, 主键(a) );

第二次创建表( 整数, b int, 主键(a,b) );

创建第三个表( 瓦查尔(20岁), b int );

请。。。帮助


首先,你确定你需要吗

无论如何。我可能在这里表示我的无知,但我认为你可能很接近,但事情的顺序不是这样的

读取生成的密钥可以这样做:

...
First first = new First();
entityManager.save(first);  //<- the id is updated

Second second = new Second();
second.setB(300);     
second.setA(first.getA()); 

first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);

entityManager.getTransaction().commit();

哦,“a”前缀是什么意思?论点模棱两可的?矛盾的一件有进取心的事

Thanx对于你,我在@manytone上尝试了@id,但它似乎不起作用。
...
First first = new First();
entityManager.save(first);  //<- the id is updated

Second second = new Second();
second.setB(300);     
second.setA(first.getA()); 

first.setSeconds( new ArrayList());
first.getSeconds().add(second);
entityManager.save(second);

entityManager.getTransaction().commit();
 @Id  // may not work
 @ManyToOne // may not work
 @JoinColumn(name = "a")
 First a;